У меня есть простой сервис Restlet, размещенный на AppEngine. Это выполняет основные операции CRUD со строками и хорошо работает со всеми видами символов UTF-8, когда я тестирую его с помощью curl (для всех глаголов).
Это используется простым клиентом рестлета, размещенным в сервлете в другом приложении AppEngine:
// set response type
resp.setContentType("application/json");
// Create the client resource
ClientResource resource = new ClientResource(Messages.SERVICE_URL + "myentity/id");
// Customize the referrer property
resource.setReferrerRef("myapp");
// Write the response
resource.get().write(resp.getWriter());
Вышеупомянутое почти все, что у меня есть в сервлете. Очень просто.
Сервлет вызывается через jquery ajax, и json, который я получаю, хорошо сформирован и все такое, но проблема в том, что строки в кодировке UTF-8 возвращаются зашифрованными, например: Université de Montréal
становится Universit?? de Montr??al
.
Я попытался добавить эту строку в сервлет (прежде всего):
resp.setCharacterEncoding("UTF-8");
Но единственная разница в том, что вместо ??
я получаю Universitᅢᄅ de Montrᅢᄅal
(я даже не знаю, что это за персонажи, наверное, азиатские).
Я на 100% уверен, что служба рестлета в порядке, потому что, кроме построчной отладки, я могу протестировать ее из строки cmd с помощью curl, и она возвращает правильно сформированные строки.
Глядя на http-заголовок ответа firefox (при вызове сервлета через javascript), я вижу, что кодировка действительно UTF-8, как и ожидалось. После нескольких часов напряженного чтения всех возможных статей по теме я наткнулся на это обсуждение рестлета и заметил, что действительно у меня есть Transfer-Encoding: chunked
в заголовке http ответа. Я попробовал предложенные решения (переопределить ClientResource.toRepresentation, не помогло, поэтому я попробовал рестлет 2.1, как было предложено с ClientResource.setRequestEntityBuffering(true)
, и здесь не повезло), но я не уверен, что моя проблема связана с Transfer-Encoding: chunked
совсем.
На данный момент у меня нет идей, и я был бы очень признателен за любые предложения! О_о
ОБНОВЛЕНИЕ:
Я попытался выполнить ручной GET с классическим UrlConnection, и строка возвращается в порядке:
URL url = new URL(Messages.SERVICE_URL + "myentity/id");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
resp.getWriter().print(writer.toString());
Так много для того, чтобы быть RESTful и причудливым ... но все же я понятия не имею, почему оригинальная версия не работает! :/