urlencode vs rawurlencode?


380

Якщо я хочу створити URL за допомогою змінної, у мене є два варіанти кодування рядка. urlencode()і rawurlencode().

У чому саме полягають відмінності та чому перевагу?


1
Мені дуже хотілося б побачити деякі причини вибору однієї або іншої (наприклад, проблеми, які можуть виникнути з тим чи іншим), я (і я очікую, що інші) хочу мати можливість просто вибрати один і назавжди використовувати його з найменше метушні, тому я почав щедро бачити це питання.
Kzqai

29
@Tchalvak: Якщо ви хочете вибрати лише один, виберіть rawurlencode. Ви рідко натрапляєте на систему, яка задихається, коли задані пробіли кодуються як %20, в той час як системи, які задихаються в кодованих просторах, +є більш поширеними.
Аномія

Відповіді:


326

Це буде залежати від вашого призначення. Якщо взаємодія з іншими системами важлива, тоді, здається, необроблений код - це шлях. Єдиним винятком є ​​застарілі системи, які очікують, що рядок запитів буде дотримуватися стилю кодування форм пробілів, кодованих як + замість% 20 ​​(у такому випадку вам потрібен urlencode).

rawurlencode відповідає RFC 1738 перед PHP 5.3.0 і RFC 3986 після цього (див. http://us2.php.net/manual/en/function.rawurlencode.php )

Повертає рядок, у якому всі не алфавітно-цифрові символи, крім -_. ~, Були замінені знаком відсотка (%), а потім двома шістнадцятковими цифрами. Це кодування, описане в »RFC 3986, для захисту буквальних символів від інтерпретації як спеціальних роздільників URL-адрес і для захисту URL-адрес від маніпулювання носіями передачі з перетворенням символів (як деякі системи електронної пошти).

Примітка щодо RFC 3986 проти 1738. rawurlencode до php 5.3 кодував символ тильди ( ~) відповідно до RFC 1738. Однак, щодо PHP 5.3, rawurlencode слід за RFC 3986, який не вимагає кодування символів тильди.

urlencode кодує пробіли як знаки плюс (не так, %20як це робиться в rawurlencode) (див. http://us2.php.net/manual/en/function.urlencode.php )

Повертає рядок, у якому всі не алфавітно-цифрові символи, крім -_. були замінені знаком відсотка (%), а потім двома шістнадцятковими цифрами та пробілами, закодованими як знаки плюс (+). Він кодується так само, як кодуються опубліковані дані з форми WWW, тобто таким же чином, як і в медіа-типі типу application / x-www-form-urlencoded. Це відрізняється від кодування RFC 3986 (див. Rawurlencode ()) тим, що з історичних причин пробіли кодуються як знаки плюс (+).

Це відповідає визначенню для application / x-www-form-urlencoded в RFC 1866 .

Додаткове читання:

Ви також можете побачити дискусію за посиланням http://bytes.com/groups/php/5624-urlencode-vs-rawurlencode .

Також RFC 2396 варто подивитися. RFC 2396 визначає дійсний синтаксис URI. Основна частина, що нас цікавить, - це 3.4 Запит компонента:

У складі запиту символи зарезервовані.";", "/", "?", ":", "@",
"&", "=", "+", ",", and "$"

Як бачимо, +символ є зарезервованим символом у рядку запиту, і тому його потрібно кодувати відповідно до RFC 3986 (як у rawurlencode).


27
Отже, що є переважним?
Гері Віллоубі

79
rawurlencode. в цьому випадку йдіть зі стандартом. urlencode зберігається лише для спадщини
Джонатан Фінгленд

2
Велике спасибі, ось що я думав, я просто хотів другу думку, перш ніж почати оновлювати багато коду.
Гері Віллоубі

3
Я думаю, що це rawurlencode, який не кодує пробіли як знаки плюс, але як% 20s
BigName

2
@Pindatjuh: Частина, яку ви цитували . Єдиним винятком є ​​застарілі системи, які очікують, що рядок запитів буде дотримуватися стилю кодування форми пробілів, кодованих як + замість% 20 ​​(у такому випадку вам потрібен urlencode) означає, що, хоча rawurlencode підходить для більшості ситуацій , деякі системи очікують, що пробіли будуть закодовані як знак + (плюс). Для таких систем кращим вибором є urlencode.
Джонатан Фінгленд

213

Доказ є у вихідному коді PHP.

Я розберу вас за допомогою швидкого процесу, як дізнатися подібну річ самостійно в будь-який час, коли захочете. Візьміть зі мною, буде багато С-вихідного коду, з яким ви зможете проглядатись (я пояснюю це). Якщо ви хочете розібратися на якомусь C, хорошим місцем для початку є наші SO wiki .

Завантажте джерело (або скористайтеся http://lxr.php.net/, щоб переглянути його в Інтернеті), оберіть усі файли для назви функції, ви знайдете щось таке:

PHP 5.3.6 (остання на момент написання статті) описує дві функції в своєму рідному коді C в файлі url.c .

RawUrlEncode ()

PHP_FUNCTION(rawurlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_raw_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

UrlEncode ()

PHP_FUNCTION(urlencode)
{
    char *in_str, *out_str;
    int in_str_len, out_str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &in_str,
                              &in_str_len) == FAILURE) {
        return;
    }

    out_str = php_url_encode(in_str, in_str_len, &out_str_len);
    RETURN_STRINGL(out_str, out_str_len, 0);
}

Гаразд, так що тут різного?

Вони обоє по суті називають дві різні внутрішні функції відповідно: php_raw_url_encode та php_url_encode

Тож іди шукати ці функції!

Давайте подивимось на php_raw_url_encode

PHPAPI char *php_raw_url_encode(char const *s, int len, int *new_length)
{
    register int x, y;
    unsigned char *str;

    str = (unsigned char *) safe_emalloc(3, len, 1);
    for (x = 0, y = 0; len--; x++, y++) {
        str[y] = (unsigned char) s[x];
#ifndef CHARSET_EBCDIC
        if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
            (str[y] < 'A' && str[y] > '9') ||
            (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
            (str[y] > 'z' && str[y] != '~')) {
            str[y++] = '%';
            str[y++] = hexchars[(unsigned char) s[x] >> 4];
            str[y] = hexchars[(unsigned char) s[x] & 15];
#else /*CHARSET_EBCDIC*/
        if (!isalnum(str[y]) && strchr("_-.~", str[y]) != NULL) {
            str[y++] = '%';
            str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
            str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
#endif /*CHARSET_EBCDIC*/
        }
    }
    str[y] = '\0';
    if (new_length) {
        *new_length = y;
    }
    return ((char *) str);
}

І звичайно, php_url_encode:

PHPAPI char *php_url_encode(char const *s, int len, int *new_length)
{
    register unsigned char c;
    unsigned char *to, *start;
    unsigned char const *from, *end;

    from = (unsigned char *)s;
    end = (unsigned char *)s + len;
    start = to = (unsigned char *) safe_emalloc(3, len, 1);

    while (from < end) {
        c = *from++;

        if (c == ' ') {
            *to++ = '+';
#ifndef CHARSET_EBCDIC
        } else if ((c < '0' && c != '-' && c != '.') ||
                   (c < 'A' && c > '9') ||
                   (c > 'Z' && c < 'a' && c != '_') ||
                   (c > 'z')) {
            to[0] = '%';
            to[1] = hexchars[c >> 4];
            to[2] = hexchars[c & 15];
            to += 3;
#else /*CHARSET_EBCDIC*/
        } else if (!isalnum(c) && strchr("_-.", c) == NULL) {
            /* Allow only alphanumeric chars and '_', '-', '.'; escape the rest */
            to[0] = '%';
            to[1] = hexchars[os_toascii[c] >> 4];
            to[2] = hexchars[os_toascii[c] & 15];
            to += 3;
#endif /*CHARSET_EBCDIC*/
        } else {
            *to++ = c;
        }
    }
    *to = 0;
    if (new_length) {
        *new_length = to - start;
    }
    return (char *) start;
}

Швидке знання, перш ніж рухатись вперед, EBCDIC - це ще один набір символів , схожий на ASCII, але загальний конкурент. PHP намагається боротися з обома. Але в основному це означає, що байт EBCDIC 0x4c байт не є Lв ASCII, це фактично <. Я впевнений, що ви бачите тут плутанину.

Обидві ці функції керують EBCDIC, якщо веб-сервер його визначив.

Крім того, вони обидва використовують масив символів (тип рядка мислив) hexchars, щоб отримати деякі значення, масив описаний як такий:

/* rfc1738:

   ...The characters ";",
   "/", "?", ":", "@", "=" and "&" are the characters which may be
   reserved for special meaning within a scheme...

   ...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
   reserved characters used for their reserved purposes may be used
   unencoded within a URL...

   For added safety, we only leave -_. unencoded.
 */

static unsigned char hexchars[] = "0123456789ABCDEF";

Крім того, функції дійсно різні, і я збираюся пояснити їх у ASCII та EBCDIC.

Відмінності в ASCII:

URLENCODE:

  • Обчислює початкову / кінцеву довжину вхідного рядка, виділяє пам'ять
  • Прогулянка по циклу, з кроком, поки ми не досягнемо кінця рядка
  • Схоплює теперішнього персонажа
  • Якщо символ дорівнює ASCII Char 0x20 (тобто "пробіл"), додайте +знак у вихідний рядок.
  • Якщо це не пробіл, і він також не буквено-цифровий ( isalnum(c)), а також не є і _, -або .символом, то ми, виводимо %знак на позицію масиву 0, робимо масив шукати до hexcharsмасиву для пошуку os_toasciiмасиву ( масив з Apache, який переводить char в шістнадцятковий код) для ключа c(теперішнього символу), потім ми розрядно зміщуємо вправо на 4, присвоюємо це значення символу 1, а в позицію 2 присвоюємо той же пошук, за винятком того, як попередньо логічно і перевірити, чи є значення 15 (0xF), і повернути 1 у цьому випадку, або 0 в іншому випадку. Зрештою, ви закінчите щось закодоване.
  • Якщо він закінчується, це не пробіл, це буквено-цифровий або один із _-.знаків, він виводить саме те, що є.

RAWURLENCODE:

  • Виділяє пам'ять для рядка
  • Ітерація над нею залежить від довжини, що надається у виклику функції (не обчислюється у функції, як у URLENCODE).

Примітка: Багато програмістів, мабуть, ніколи не бачили циклу ітерації таким чином, це дещо хакітно, а не стандартна конвенція, яка використовується для більшості циклів, зверніть увагу, вона призначає xі y, перевіряє на вихід на lenдосягнення 0, а також з кроком як xі y. Я знаю, це не те, що ви очікували, але це дійсний код.

  • Призначає поточний символ у відповідне положення символу в str.
  • Він перевіряє, чи справжній символ буквено-цифровий, або один із _-.знаків, і якщо його немає, ми виконуємо майже те саме завдання, що й у URLENCODE, де він виконує пошук, проте ми збільшуємо по-іншому, використовуючи, y++а не to[1]це, тому що рядки будуються різними способами, але все одно досягають тієї самої мети.
  • Коли цикл виконаний і довжина минула, він фактично припиняє рядок, присвоюючи \0байт.
  • Він повертає закодований рядок.

Відмінності:

  • UrlEncode перевіряє простір, присвоює знак +, RawURLEncode не робить.
  • UrlEncode не присвоює \0байт рядку, як це робить RawUrlEncode (це може бути точка суперечки)
  • Вони неодноразово повторюються, можливо, хтось схильний переповнюватись неправильно сформованими рядками, я просто пропоную це, і я насправді не досліджував.

Вони в основному повторюють інакше, кожен призначає знак + у випадку ASCII 20.

Відмінності в EBCDIC:

URLENCODE:

  • Те саме налаштування ітерації, як і у ASCII
  • Ще перекладаємо символ "пробіл" на знак " + ". Примітка. Я думаю, що це потрібно зібрати в EBCDIC, або у вас виникне помилка? Хтось може це відредагувати та підтвердити?
  • Він перевіряє , якщо присутній символ являє собою символ , перш 0, за винятком того , щоб бути .або -, або менш ніж , Aале більше , ніж символ 9, або більше , ніж Zта менш ніж , aале не _. АБО більше, ніж z(так, EBCDIC начебто зіпсований для роботи). Якщо він відповідає будь-якому з них, зробіть аналогічний пошук, як знайдено у версії ASCII (він просто не потребує пошуку в os_toascii).

RAWURLENCODE:

  • Те саме налаштування ітерації, як і у ASCII
  • Перевірте те саме, що описано у версії EBCDIC для кодування URL-адреси, за винятком того, що якщо він більший за z, він виключає ~з кодування URL-адреси.
  • Те саме призначення, що і ASCII RawUrlEncode
  • Додавання \0байта до рядка перед поверненням.

Основне резюме

  • Обидва використовують одну і ту ж таблицю пошуку шестигранників
  • URIEncode не завершує рядок з \ 0, необроблений.
  • Якщо ви працюєте в EBCDIC, я б запропонував використовувати RawUrlEncode, оскільки він керує тим, ~що UrlEncode не робить ( це повідомляється про проблему ). Варто зазначити, що ASCII та EBCDIC 0x20 - це пробіли.
  • Вони повторюються по-різному, одна може бути швидшою, може бути схильною до пам’яті або на основі струнних подвигів.
  • URIEncode робить пробіл +, а RawUrlEncode робить пробіл у %20пошуку через масив.

Відмова: Я не торкався С у роках, і не дивився на EBCDIC вже дуже довго. Якщо я десь помиляюся, дайте мені знати.

Пропоновані реалізації

Виходячи з усього цього, rawurlencode - це спосіб пройти більшу частину часу. Як ви бачите у відповіді Джонатана Фінгленда, дотримуйтесь її в більшості випадків. Він стосується сучасної схеми для компонентів URI, де як urlencode робить речі старої школи, де + означало "простір".

Якщо ви намагаєтеся конвертувати між старим форматом і новим форматами, переконайтеся, що ваш код не збільшиться, і перетворіть щось, що є декодованим + знаком, у простір випадковим чином подвійним кодуванням або подібними сценаріями "ой" навколо цього простір / 20% / + випуск.

Якщо ви працюєте в старшій системі зі старшим програмним забезпеченням, яке не надає перевагу новому формату, дотримуйтесь урленкоду, проте, я вважаю, що% 20 насправді буде сумісним назад, як за старим стандартом% 20 працював, просто не було кращий. Дайте йому постріл, якщо ви готові пограти, дайте нам знати, як це вийшло для вас.

В основному, ви повинні дотримуватися сировини, якщо ваша система EBCDIC насправді не ненавидить вас. Більшість програмістів ніколи не зіткнуться з EBCDIC в будь-якій системі, зробленій після 2000 року, можливо, навіть у 1990 році (це підштовхує, але все ж, на мою думку).


Мені ніколи не доводилося турбуватися про подвійне кодування, адже я повинен знати, що я кодував, оскільки це я роблю кодування, я б думав. Оскільки я декодую все, що отримую, в режимі сумісності, який вміє поводитися з + для простору, я однаково ніколи не стикаюся з проблемами, про які ви намагаєтеся попередити тут. Я можу зрозуміти, дивлячись на джерело, якщо ми не знаємо, що щось робить, але що саме ми тут дізналися, чого не знали вже, просто виконуючи обидві функції. Я знаю, що я упереджений, але не можу не допомогти, але думаю, що це пішло за борт. Кудо на зусилля, хоча! =)
nickl-

2
+1, для цієї частини: "Я вважаю, що% 20 насправді буде сумісним назад, так як за старим стандартом% 20 працював, просто не було бажано"
Гра подвійний

3
Хороша відповідь, але, можливо, трохи зайвого?
rinogo

38
echo rawurlencode('http://www.google.com/index.html?id=asd asd');

врожайність

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd%20asd

поки

echo urlencode('http://www.google.com/index.html?id=asd asd');

врожайність

http%3A%2F%2Fwww.google.com%2Findex.html%3Fid%3Dasd+asd

Різниця в asd%20asdпорівнянні з vsasd+asd

urlencode відрізняється від RFC 1738 кодуванням пробілів +замість%20


28

Однією практичною причиною вибору одного за іншим є те, якщо ви збираєтеся використовувати результат в іншому середовищі, наприклад, JavaScript.

У PHP urlencode('test 1')повертається, 'test+1'а rawurlencode('test 1')повертається 'test%201'як результат.

Але якщо вам потрібно "розшифрувати" це в JavaScript за допомогою функції decodeURI (), тоді decodeURI("test+1")ви отримаєте, в "test+1"той час як decodeURI("test%201")дасте вам "test 1"результат.

Іншими словами, простір (""), кодований урленкодом до плюс ("+") в PHP, не буде належним чином розшифрований decodeURI в JavaScript.

У таких випадках слід використовувати функцію PHP rawurlencode .


6
Це, безумовно, найкраща відповідь, яку я бачив. Він пропонує пропозицію для використання, повернувшись із прикладу реального світу. Крім того, це лаконічно.
dotancohen

Це приємний приклад, хоча я віддаю перевагу json_encodeі JSON.parseдля цієї мети.
Fabrício Matté

21

Я вважаю, що пробіли повинні бути закодовані як:

  • %20 при використанні всередині компонента шляху URL
  • +при використанні всередині компонента чи даних рядка запиту URL-адреси (див. 17.13.4 Типи вмісту форми )

Наступний приклад показує правильне використання rawurlencodeта urlencode:

echo "http://example.com"
    . "/category/" . rawurlencode("latest songs")
    . "/search?q=" . urlencode("lady gaga");

Вихід:

http://example.com/category/latest%20songs/search?q=lady+gaga

Що станеться, якщо ви кодуєте компоненти шляху та запиту рядки навпаки? Для наступного прикладу:

http://example.com/category/latest+songs/search?q=lady%20gaga
  • Веб-сервер шукатиме каталог latest+songsзамістьlatest songs
  • Параметр рядка запиту qбуде міститиlady gaga

2
"Параметр рядка запиту qбуде містити lady gaga" Що ще він би містив інакше? qЗдається, параметр запиту має те саме значення, яке передається $_GETмасиву незалежно від використання rawurlencodeабо urlencodeв PHP 5.2+. Хоча, urlencodeкодує у application/x-www-form-urlencodedформаті, який за замовчуванням для GET-запитів, тому я підходжу до вашого підходу. +1
Fabrício Matté

2
Я хотів уточнити, що обидва +і %20декодуються як простір при використанні в рядках запитів.
Салман

5

Різниця полягає у повернених значеннях, тобто:

urlencode () :

Повертає рядок, у якому всі не алфавітно-цифрові символи, крім -_. були замінені знаком відсотка (%), а потім двома шістнадцятковими цифрами та пробілами, закодованими як знаки плюс (+). Він кодується так само, як кодуються опубліковані дані з форми WWW, тобто таким же чином, як і в медіа-типі типу application / x-www-form-urlencoded. Це відрізняється від кодування RFC 1738 (див. Rawurlencode ()) тим, що з історичних причин пробіли кодуються як знаки плюс (+).

rawurlencode () :

Повертає рядок, у якому всі не алфавітно-цифрові символи, крім -_. були замінені знаком відсотка (%) з двома шістнадцятковими цифрами. Це кодування, описане в »RFC 1738, для захисту буквальних символів від інтерпретації як спеціальних роздільників URL-адрес і для захисту URL-адрес від маніпулювання носіями передачі з перетворенням символів (як деякі системи електронної пошти).

Два дуже схожі, але останній (rawurlencode) замінить пробіли знаком '%' та двома шістнадцятковими цифрами, що підходить для кодування паролів або таких, де '+' не є, наприклад:

echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
     '@ftp.example.com/x.txt">';
//Outputs <a href="ftp://user:foo%20%40%2B%25%2F@ftp.example.com/x.txt">

2
ОП запитує, як знати, що використовувати і коли. Знання того, що кожен робить з пробілами, не допомагає ОП приймати рішення, якщо він не знає важливості різних повернених значень.
dotancohen

5

1. У чому саме полягають відмінності та

Єдина відмінність полягає в тому, як обробляються простори:

urlencode - на основі застарілої реалізації перетворює пробіли в +

rawurlencode - на основі RFC 1738 переводить пробіли у% 20

Причина різниці полягає в тому, що + є зарезервованим та дійсним (незашифрованим) у URL-адресах.

2. що є кращим?

Мені дуже хотілося б побачити деякі причини вибору одного за іншим ... Я хочу, щоб я міг просто вибрати один і використати його назавжди з найменшою суєтою.

Справедливо кажучи, у мене є проста стратегія, яку я дотримуюся, приймаючи ці рішення, якими я поділюсь з вами, сподіваючись, що це може допомогти.

Я думаю, що саме "HTTP / 1.1 специфікація RFC 2616" закликала " Толерантні програми "

Клієнти повинні бути толерантними до розбору рядка статусу, а сервери - толерантними під час розбору рядка запиту.

Якщо зіткнутися з подібними питаннями, найкраща стратегія - це завжди споживати якомога більше і виробляти те, що відповідає стандартам.

Тому моя порада полягає у використанні rawurlencodeдля створення відповідних стандартам рядків, кодованих RFC 1738, і використовувати urldecodeдля того, щоб бути сумісними назад і вміщувати все, що ви можете зіткнутися для споживання.

Тепер ви можете просто взяти моє слово на це, але давайте докажемо, чи ми ...

php > $url = <<<'EOD'
<<< > "Which, % of Alice's tasks saw $s @ earnings?"
<<< > EOD;
php > echo $url, PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > echo urlencode($url), PHP_EOL;
%22Which%2C+%25+of+Alice%27s+tasks+saw+%24s+%40+earnings%3F%22
php > echo rawurlencode($url), PHP_EOL;
%22Which%2C%20%25%20of%20Alice%27s%20tasks%20saw%20%24s%20%40%20earnings%3F%22
php > echo rawurldecode(urlencode($url)), PHP_EOL;
"Which,+%+of+Alice's+tasks+saw+$s+@+earnings?"
php > // oops that's not right???
php > echo urldecode(rawurlencode($url)), PHP_EOL;
"Which, % of Alice's tasks saw $s @ earnings?"
php > // now that's more like it

Здавалося б, PHP мав саме це на увазі, хоча я ніколи не стикався з тим, щоб хтось відмовився від будь-якого з двох форматів, я не можу придумати кращу стратегію, яку слід прийняти як свою стратегію дефакто, чи не так?

nJoy!


4

urlencode : Це відрізняється від кодування RFC 1738 (див. rawurlencode ()) тим, що з історичних причин пробіли кодуються як знаки плюс (+).


2

Пробіли, кодовані як %20vs.+

Найбільшою причиною, яку я бачив використовувати rawurlencode()в більшості випадків, є те, що urlencodeкодує текстові пробіли як +(плюс знаки), де rawurlencodeкодує їх як загальновідомі %20:

echo urlencode("red shirt");
// red+shirt

echo rawurlencode("red shirt");
// red%20shirt

Я спеціально бачив певні кінцеві точки API, які приймають закодовані текстові запити, які очікуються на %20пробіл, і, як результат, не вдасться, якщо замість цього використовується знак плюс. Очевидно, що це буде відрізнятися між реалізаціями API, і ваш пробіг може відрізнятися.


1

Я вважаю, що urlencode призначений для параметрів запиту, тоді як rawurlencode - для сегментів шляху. В основному це пов'язано з %20сегментами шляху проти +параметрів запиту. Дивіться цю відповідь, яка говорить про пробіли: Коли кодувати простір на плюс (+) або% 20?

Однак %20зараз працює і в параметрах запиту, саме тому rawurlencode завжди безпечніший. Однак знак плюс, як правило, застосовується там, коли важливий досвід редагування та читабельність параметрів запиту.

Зауважте, що це засіб rawurldecodeне розшифровується +на пробіли ( http://au2.php.net/manual/en/function.rawurldecode.php ). Ось чому $ _GET завжди автоматично передається через urldecode, а це значить , що +і %20обидва декодувати в просторах.

Якщо ви хочете, щоб кодування та декодування були узгодженими між входами та виходами, і ви вибрали завжди використовувати, +а не %20для параметрів запиту, тоді urlencodeдобре для параметрів запиту (ключ і значення).

Висновок такий:

Сегменти шляху - завжди використовуйте rawurlencode / rawurldecode

Параметри запиту - для декодування завжди використовуйте urldecode (робиться автоматично); для кодування і rawurlencode, і urlencode є нормальним, просто виберіть один, щоб бути послідовним, особливо при порівнянні URL-адрес.


0

простий * rawurlencode шлях - шлях є частиною перед "?" - пробіли повинні бути закодовані як% 20 * urlencode рядка запиту - рядок запиту є частиною після "?" -простори краще кодуються, оскільки "+" = rawurlencode взагалі більш сумісний

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.