Emoji не кодируются правильно для записи вывода

Программа принимает комментарий и сохраняет его. База данных сохраняет значение правильно (я могу скопировать и вставить его на страницу смайликов, и оно отображается правильно). Строка, которую я вижу в отладчике в запросе postComment и в ответе getAllComments, одинакова, но она отправляет {0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x80} вместо {0xF0, 0x9F, 0x98, 0x80} и показывает в виде нескольких символов вместо 1. Если я установлю кодировку UnicodeBig, смайлики появятся в ответе, но нам нужно использовать UTF-8

String jsonString = jsonMapper.toJson(jsonResponse);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().println(jsonString);

Нужно ли мне что-то делать с этими строками, прежде чем система закодирует utf8? используемые библиотеки

json-simple-1.1 (текущая версия 1.1.1) jackson-core-2.2.3 (текущая версия 2.6)

Спасибо.


person Sean Carlisle    schedule 16.06.2015    source источник
comment
Какую строку JSON вы ожидаете? Это должны быть кодовые точки? { 0xF0, 0x9F, 0x98, 0x80 } Мне это не кажется смайликом. U+00F0 - латинская строчная буква Eth - ð. Остальные — это управляющие символы Unicode.   -  person gilly3    schedule 17.06.2015
comment
должно быть ухмыляющееся лицо iemoji.com/view/emoji/885/people /ухмыляющееся лицо   -  person Sean Carlisle    schedule 17.06.2015
comment
похоже, что он отправляет uD83D ���, как если бы это были разные символы   -  person Sean Carlisle    schedule 17.06.2015
comment
Правильный способ выразить кодовую точку Unicode U+1f600 в виде строки в JSON — "\uD83D\uDE00".   -  person gilly3    schedule 17.06.2015
comment
именно так он отображается в java, но при выводе он отправляется как 0xED, 0xA0, 0xBD, 0xED, 0xB8, 0x80 вместо 0xF0, 0x9F, 0x98, 0x80. именно так он отправляется на сервер в первую очередь.   -  person Sean Carlisle    schedule 17.06.2015
comment
Я взял байты строки по умолчанию, затем создал новую строку из байтов и кодировки UTF-8 и вернул ту же строку. поэтому он пришел как UTF-8 4 байта, почему он должен передавать как 6 байтов, если кодировка не изменилась?   -  person Sean Carlisle    schedule 19.06.2015


Ответы (1)


Это оказалось проблемой с Jetty 7. Чтобы обойти это, вы можете просто .getBytes(String), а затем записать байты и очистить буфер. Java получит правильные байты и не будет кодировать суррогатную пару, что Jetty делал по умолчанию.

person Sean Carlisle    schedule 16.01.2017