UTF-8 Строки, зашифрованные Restlet в GAE

У меня есть простая служба 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 ?? де Монреаль .

Я попытался добавить эту строку в сервлет (прежде всего):

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.setRe questEntityBuffering (true) , и там тоже не повезло), но Я не уверен, что моя проблема связана с Transfer-Encoding: chunked at all .

На данный момент у меня нет идей, и я был бы очень признателен за любые предложения! O_o

UPDATE :

Я попытался выполнить 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 и причудливым ... но все же я понятия не имею почему не работает оригинальная версия! : /

6
задан JohnIdol 31 December 2011 в 07:12
поделиться