Nano Hash - криптовалюты, майнинг, программирование

Строки 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?? 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.setRe​questEntityBuffering​(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 и причудливым ... но все же я понятия не имею, почему оригинальная версия не работает! :/


  • Кодирование фрагментированной передачи не должно быть связано с проблемами кодировки ... Если вы записываете необработанную строку, о которой идет речь, в resp.getWriter(), полностью минуя рестлет, правильно ли она передается? 31.12.2011
  • Вы имеете в виду выполнение «ручного» GET для моей службы из сервлета? 31.12.2011
  • Смотрите обновление, оно работает нормально, если я обхожу рестлет. Я думаю это баг рестлета или смт О_о 31.12.2011

Ответы:


1

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

07.08.2012

2

Содержит ли ваш ответ соответствующий заголовок «Content-Type»? Должно быть что-то вроде "Content-Type: application/json; charset=UTF-8" (обратите внимание на кодировку).

Попробуйте запустить сервер разработки и получить свой ресурс из командной строки с помощью cURL и проверить заголовки, например. curl -i http://localhost:8080/myentity/id. Теоретически браузеры должны использовать UTF-8 для JSON, но я бы не стал этому доверять.

24.03.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..