мой стек переполнен :):):):) Я не могу найти решение...
Я разрабатываю серверно-клиентское приложение. Мой клиент GWT работает в браузере. Общайтесь с моим сервером C++ с помощью: GWT-JSON -> lighttpd -> libfcgi -> cgicc -> libjson -> приложение C++
Моя проблема: ответ сервера со строкой JSON на запрос клиента. Этот ответ содержит строки UTF-8. Символы акцента закодированы правильно с "\uXXXX" в ответ. Например: "Á" закодировано: "Ã". Клиент извлекает строку из строки JSON. Но извлеченная строка содержит плохо закодированные символы. :(:(:(:(
К счастью, я могу сузить проблему до JSON-GWT. Вот код, демонстрирующий проблему, работающий на стороне клиента только в GWT:
String response="{ \"test\" : \"\\u00C3\\u0081\\u00C3\\u0089\\u00C5\\u00B0\" }"; //"ÁÉÜ" in UTF-8
JSONObject json=JSONParser.parseStrict(response).isObject();
String s1=json.get("test").isString().stringValue();
Window.alert(s1);
byte[] b1=s1.getBytes();
Результаты:
Alert is: "ÃÉŰ" instead of "ÁÉÜ"
s1="ÃÉŰ" instead of "ÁÉÜ"
b1=[ 0xc3, 0x83, 0xc2, 0x81, 0xc3, 0x83, 0xc2, 0x89, 0xc3, 0x85, 0xc4, 0xb0 ] (incorrect)
Вот еще один тест:
String s2="ÁÉŰ";
Window.alert(s2);
byte[] b2=s2.getBytes();
Результаты:
Alert: "ÁÉÜ" (correct)
s2="ÁÉÜ" (correct)
b2=[ 0xc3, 0x81, 0xc3, 0x89, 0xc5, 0xb0 ] (correct, same as in "response" string above)
Я думаю, что JSONParser.parseStrict или JSONObject.get().isString().stringValue() не могут правильно обрабатывать символы UTF-8...
Любая идея? :(:(:(:(
Дополнительная информация: Content-Type запроса и ответа — «application/json; charset=UTF-8». Файлы исходного кода и среда разработки используют кодировку UTF-8. HTML-страница в кодировке браузера тоже UTF-8.
У меня проблема только с ответом только. Кодировка/кодировка символов запроса верна.
Спасибо за любую помощь, Тибор
Обновление 1:
String s1b=new String(s1.getBytes("ISO-8859-1"));
Возвращает: s1b="ÁÉÜ" (верно)
Это некрасиво и странно. Почему мне нужно преобразовать строку UTF-8 в ISO-8859-1, чтобы снова получить строку UTF-8? Я не понимаю... :(:(:(
Обновление 2:
Если я отключу экранирование "\ u00xx" в модуле записи JSON на стороне сервера, все будет работать как положено. Но согласно RFC4627 это не очень хорошая идея :((((. В этом режиме строка JSON переносит непечатаемые символы (0xc3, 0x81, 0xc3, 0x89, 0xc5, 0xb0) ("ÁÉÚ" в UTF-8 ) без какой-либо кодировки.... :(:(:( Парсер GWT JSON правильно расширяет символ UTF-8, и в предупреждении отображаются правильные символы. Я постоянно думаю, что неправильное декодирование близко к декодированию GWT JSON...