encodeURIComponent с использованием кодировки ISO-8859-1 для строки javascript

Я пытался получить эту работу, но пока не повезло. Я не очень понимаю, что происходит, но я постараюсь объяснить как можно больше. Все мои страницы jsp на стороне сервера используют кодировку ISO-8859-1, которую я не хочу менять. Все запросы/ответы представлены в формате xml. В настоящее время запрос POST использует функцию escapeURIComponent javascript, и все работало хорошо, пока в нем не появились специальные символы, например строка: hello°world©®™test. Когда эта строка отправляется (с escapeURIComponent в часть данных) из IE, и когда страница перезагружается, которая должна получить ту же строку, строка отображается как: hello°world©®™test

Я предполагаю, что это происходит, поскольку функция encodeURIComponent кодирует строку в UTF-8, а не в ISO-8859-1, и когда страница отображается, UTF-8 интерпретируется как символ ISO-8859-1 и, следовательно, показывает веревка исказилась.

Есть ли способ решить эту проблему без преобразования веб-страниц в кодировку UTF-8?

В запросе POST для Content-Type установлено значение «application/x-www-form-urlencoded».

Заранее спасибо.


person user1719160    schedule 05.12.2013    source источник


Ответы (1)


Во-первых, я настоятельно рекомендую вам просто из принципа отказаться от своей приверженности ISO-8859-1 и переключиться на UTF-8; однако это не решит вашу насущную проблему, так что давайте оставим эту битву на другой день.

encodeURIComponent всегда использует кодировку UTF-8. Это не может быть изменено; хотя вы можете вручную взломать кодировку процентов, которую производит encodeURIComponent, я не думаю, что это будет продуктивным использованием чьего-либо времени.

Исходя из вашего описания, я бы на самом деле поставил проблему еще дальше: ваш сервер считает, что в строке есть эти символы Â, и поэтому отправляет обратно в ваш браузер необходимый код для отображения этих символов. Простое изменение кодировки, которую выводит ваш сервер, приведет к тому, что ваш сервер отправит коды UTF-8 для Â, и на самом деле не поможет.

Итак, проблема заключается в следующем: как сообщить серверу, что входящие данные имеют процентную кодировку UTF-8, а не процентную кодировку 8859-1, как, по-видимому, полагает сервер?

Вы не указываете в своем сообщении, отправляется ли отправляемая вами строка как часть URL-адреса (то есть вы отправляете POST на какой-либо URL-адрес, например http://myserver/mypage.jsp?theString=hello%C2%B0world%C2%A9%C2%AE%E2%84%A2test) или как часть тела POST. Обычно с помощью POST вы отправляете данные как часть тела POST. Если это так, попробуйте добавить

<% request.setCharacterEncoding("UTF-8"); %>

в начало вашего jsp - это говорит серверу интерпретировать входящие запросы как находящиеся в UTF-8, даже если исходящие данные по-прежнему 8859-1. Если у вас есть какие-либо <form> элементы, указывающие на эту страницу, вы должны добавить accept-charset к форме, которая говорит "UTF-8".

Если случайно то, что вы передаете, находится в самом URL-адресе, вам нужно установить URIEncoding в любом контейнере сервлета, который вы используете; если это Tomcat, см. ответ на этот вопрос.

person Daniel Martin    schedule 05.12.2013
comment
<% request.setCharacterEncoding("UTF-8"); %> работал. Спасибо!!! - person user1719160; 06.12.2013
comment
Вы также можете использовать escape() вместо encodeURIComponent(). - person David Gallardo; 19.07.2019