Я пытаюсь передать параметры из среднего уровня PHP в бэкэнд Java, который понимает J2EE. Я пишу код контроллера в Groovy. Там я пытаюсь декодировать некоторый параметр, который, вероятно, будет содержать международные символы.
Я до сих пор озадачен результатами отладки этой проблемы, поэтому я хотел поделиться ею с вами в надежде, что кто-то сможет дать правильную интерпретацию моих результатов.
Ради моего маленького теста, параметр, который я передаю, это "déjeuner". Просто чтобы быть уверенным, System.out.println ("déjeuner") правильно дает мне:
déjeuner
в консоли
Теперь ниже приведены значения char / dec и hex каждого символа оригинальной строки:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
обратите внимание, что последовательность c3a9 в UTF-8 является желаемым символом: http://www.fileformat.info/info/unicode/char/00e9/index.htm
Теперь, если я попытаюсь прочитать эту строку как строку UTF-8, как в stmt.getBytes ("UTF-8"), я внезапно получу последовательность из 11 байтов, как показано ниже:
64 c3 83 c2 a9 6a 65 75 6e 65 72
, тогда как stmt.getBytes ("iso-8859-1") дает мне 9 байтов:
64 c3 a9 6a 65 75 6e 65 72
обратите внимание на последовательность c3a9 здесь!
теперь, если я попытаюсь преобразовать последовательность UTF-8 в UTF-8, как в
new String(stmt.getBytes("UTF-8"), "UTF-8");
Я получаю:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
обратите внимание на последовательность c3a9
, а
new String(stmt.getBytes("iso-8859-1"), "UTF-8")
Результат:
next char: d 100 64
next char: ? -23 e9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
обратите внимание на e9, который в utf-8 (и ascii), опять же, символ 'é', которого я так жажду.
К сожалению, ни в одном из случаев я не получаю правильную строку, которая будет отображаться как буквальная строка "déjeuner". Как ни странно, обе последовательности байтов кажутся правильными.