Проблема с кодировкой текста UTF-8 в Google App Engine DataStore - PullRequest
5 голосов
/ 30 июня 2010

Я создаю приложение gwt, которое хранит текст случайных веб-страниц в текстовом поле хранилища данных.Часто текст форматируется UTF-8.Все файлы моего приложения хранятся в формате UTF-8, и когда я запускаю приложение на локальном компьютере, весь процесс работает нормально.Текст UTF-8 хранится как таковой и может быть извлечен из локальной версии ядра приложения как UTF-8.Однако, когда я развертываю приложение в движке приложения Google где-то между тем, когда я сохраняю текст, и когда я получаю его, это больше не UTF-8, в результате чего символы, отличные от ascii, будут отображаться как?просмотреть хранилище данных в панели управления appengine, все специальные символы отображаются как?что заставляет меня поверить, что это проблема при записи в базу данных.

Кто-нибудь знает, как это исправить?

Само приложение немного велико.Вот какой-то псевдокод:

Text webPageText = new Text(<STRING THAT CONTAINS UNICODE CHARACTERS>);

/*Some Code to store Text object on datastore
Specifically I'm using javax.jdo.PersistenceManager to do this.
Some Code to retrieve text from datastore. */

String retrievedText = webPageText.getValue();

Проблема в том, что возвращаемый текст возвращается?вместо символов Юникода.

Вот похожая проблема в python, которую я обнаружил: Попытка сохранить данные Utf-8 в хранилище данных, получая UnicodeEncodeError .Хотя мое приложение не получает никаких ошибок.

К сожалению, я думаю, что строки Java по умолчанию являются utf-8, и я не могу найти код, который позволил бы мне объявить их явно как utf-8.

Редактировать: я сейчас создал небольшое веб-приложение, которое принимает текст в кодировке Unicode, сохраняет его в хранилище данных и затем извлекает его без проблем.Я до сих пор не знаю, в чем проблема в моем исходном коде, но я собираюсь изменить способ, которым мой код обрабатывает поиск веб-страниц, чтобы соответствовать меньшему приложению, которое я только что создал.Спасибо всем за помощь.

Ответы [ 4 ]

3 голосов
/ 02 сентября 2011

Исправлена ​​одна и та же проблема, задав кодировку запроса и ответа в utf-8.Запросить результаты кодирования в действительной строке, хранящейся в хранилище данных, без него значения будут сохранены как «???? ...»

Запросы: если вы используете Apache HTTP Client, это делается следующим образом:

Получить запрос:

NameValuePair... params;
...
String url = urlBase + URLEncodedUtils.format(Arrays.asList(params), "UTF-8");
HttpGet httpGet = new HttpGet(url);

Опубликовать запрос:

NameValuePair... params;
...
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(Arrays.asList(params), "UTF-8"));

Ответ: если вы строите свой ответ в HttpServlet, это делается следующим образом:

HttpServletResponse resp;
...
resp.setContentType("text/html; charset=utf-8");
1 голос
/ 18 августа 2012

Решение по кодированию: Причина Использование браузером "8859_1" charset
=> До
Сохранить Datastore, я конвертирую кодировку.

new String(req.getParameter("title").getBytes("8859_1"),"utf-8")

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

* После 1009 * => Сохранить код хранилища данных.

new String(req.getParameter("title").getBytes("utf-8"),"utf-8")
1 голос
/ 30 июня 2010

Я попытался преобразовать String в ByteArray, а затем сохранить его как blob хранилища данных.

//Save String as Blob
Blob webPageText = new Blob(<STRING THAT CONTAINS UNICODE CHARACTERS>.getBytes());

//Retrieve Blob as String
String retrievedText = new String(webPageText.getBytes());

Первоначально я думал, что это решило проблему, но я по ошибке проверил ее только на своем локальном сервере. Этот код еще возвращается? вместо символов юникода, что наводит меня на мысль, что проблема не в хранилище данных, а в передаче из обработчика приложений клиенту.

0 голосов
/ 30 июня 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...