encodeURIComponent() разница с браузерами и символами [ä ö å]
У меня проблема с encodeURIComponent()
как кажется, ведет себя не так, как браузеры (протестировано с Chrome и Firefox):
encodeURIComponent('ä')
возвращается%C3%A4
escape('ä')
возвращается%E4
- Chrome/Firefox кодирует
ä
в форме x-www-form-urlencoded как%E4
Итак, почему encodeURIComponent
вести себя иначе, чем все остальные (в основном браузеры)? Это на самом деле вызывает проблемы, так как некоторые сайты не понимают, что я пытаюсь их накормить. Этот веб-сайт http://verkkopalvelu.vrk.fi/Nimipalvelu/default.asp?L=1 (нажмите "Etunimihaku", так как он основан на iframe).
Является encodeURIComponent
сломан и как эту ситуацию нужно исправить? Каков был бы правильный способ кодировать символы, такие как ä ö å
? escape()
похоже, кодирует так же, как те браузеры, но escape()
устарела.
Я протестировал браузеры с Fiddler, а также на вкладке Console/Network отображается кодировка как %E4
когда я отправляю форму. Также тестовая ссылка здесь: http://jsfiddle.net/tcyfktvg/1/
1 ответ
encodeURIComponent()
не сломан Он кодирует символы с использованием набора символов UTF-8. Всегда. ( ECMAScript 3-е издание (ECMA-262), стр. 82)
escape()
для кодирования используется Unicode ( ECMAScript 1st Edition (ECMA-262), стр. 60). Если код Unicode < 256, то используется простое двухбуквенное представление, как вы видите для "ä". Если код Unicode>= 256, то используется расширенное представление из четырех символов с лидирующей буквой "u". Пример: escape("겧") == "%uACA7"
,
Проблема возникает, когда http-сервер получает закодированный URL. Это должно декодировать это. Но сам URL не говорит, какая кодировка использовалась для его создания.
Этот URL: http://server/%C3%A4
может быть http://server/ä
если это было закодировано encodeURIComponent()
(используя UTF-8), но это также может быть http://server/ä
кодируется escape()
(с использованием Unicode):
encodeUriComponent("ä") == "%C3%A4"
escape("ä") == "%C3%A4"
Это зависит от конфигурации сервера, который будет использовать кодировку для декодирования URL. Итак, вот решение вашей проблемы: узнайте, какую URL-кодировку ожидает http-сервер, и выберите подходящий метод кодирования.