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-сервер, и выберите подходящий метод кодирования.

Другие вопросы по тегам