Разница в декодировании / кодировании URL UTF-8 между Java и JS / AS3 (ошибка !?) - PullRequest
5 голосов
/ 26 мая 2011

У меня есть проблемный URL, декодирующий строку UTF-8 в Java, которая кодируется с помощью Javascript или Actionscript 3. Я настроил тестовый пример следующим образом:

Строка, о которой идет речь, - Produktgröße

Когда я кодирую с помощью JS / AS3, я получаю следующую строку:

escape('Produktgröße')

Produktgr% F6% DFe

Когда я отменяю это с JS, я не получаю никаких изменений

unescape('Produktgr%F6%DFe')

Produktgr% F6% DFe

Итак, я предполагаю, что JS неправильно кодирует строку ??

Следующая JSP производит эту выходную команду

<%@page import="java.net.URLEncoder"%>
<%@page import="java.net.URLDecoder"%>
<%=(URLDecoder.decode("Produktgr%F6%DFe","UTF-8"))%><br/>
<%=(URLEncoder.encode("Produktgröße","UTF-8"))%><br/>
<%=(URLEncoder.encode("Produktgröße"))%><br/>
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße")))%><br/>
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße"),"UTF-8"))%><br/>

Produktgr? Е

Produktgr% C3% B6% C3% 9Fe

* * Produktgr тысячу двадцать-три% C3% B6% C3% 9Fe

Produktgröße

Produktgröße

Есть идеи, почему у меня такое несоответствие с языками и почему JS / AS3 ведет себя не так, как я ожидаю?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 26 мая 2011

escape является устаревшей функцией и неправильно кодирует символы Юникода. Используйте encodeURI или encodeURIComponent , последний из которых, вероятно, является наиболее подходящим для ваших нужд.

1 голос
/ 18 декабря 2015

Я боролся с этой проблемой в течение нескольких часов подряд ... Моя проблема заключалась в вызове JQuery Ajax, например:

return $.ajax({
        url: '/author!getAuthorContent.action',
        type: 'GET',
        data : {author:name, 'content_type': ct || 'all', 'start': start || 0}
    });

'name' - это строка, содержащая специальные символы, такие как Jérôme-Serrano

По некоторым причинам способ, которым JS / JQuery кодировал эти специальные символы, был несовместим, и я не мог декодировать его в Java BackEnd ...

Решение было:

  • Кодирование на стороне JS с использованием var econded = encodeURIComponent(name);
  • Расшифровка их на стороне Java с использованием String decoded = java.net.URLDecoder.decode(econded ,"UTF-8");

некоторые ссылки: http://www.programering.com/a/MjN2ADOwATg.html http://www.theerrormessage.com/2013/10/weird-characters-transmitted-to-and-from-server-through-jquery-ajax-call/

1 голос
/ 26 мая 2011

Javascript - это URL, кодирующий вашу строку с использованием кодировки Latin-1 .Java - это кодировка URL с использованием UTF-8 .

Кодировка URL действительно заменяет символы / байты, которые она не распознает.Например, даже если вы будете придерживаться символов ASCII, ( будет закодировано как %28.У вас возникает дополнительная проблема наборов символов, когда вы начинаете использовать не-ASCII символы (любая вещь длиннее 7 бит).

...