WedX - журнал о программировании и компьютерных науках

Неправильный синтаксический анализ строки UTF-8 в GWT JSON

мой стек переполнен :):):):) Я не могу найти решение...

Я разрабатываю серверно-клиентское приложение. Мой клиент 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...

30.05.2013

Ответы:


1

Ваш сервер сломан; он неправильно использует JSON. Эскейпы Unicode в JSON соответствуют кодовым единицам UTF-16, поэтому Á следует кодировать как \u00c1, не как двухсимвольную строку, которую вы заключаете в кавычки.

30.05.2013
  • Измените приведенный выше пример строки: String response={ \test\ : \\Á\É\Ű\ }; //БЭУ в UTF-16 Все работает корректно. Спасибо.. 31.05.2013
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]