Google App Engine数据存储文本UTF-8编码问题

时间:2010-06-29 22:33:21

标签: google-app-engine utf-8 google-cloud-datastore

我正在构建一个gwt应用程序,它将随机网页的文本存储在数据存储区文本字段中。通常文本格式为UTF-8。我的应用程序的所有文件都存储为UTF-8,当我在本地计算机上运行应用程序时,整个过程运行正常。 UTF-8文本以这样的形式存储,并可以作为UTF-8从应用引擎的本地版本中检索。但是,当我将应用程序部署到谷歌应用程序引擎之间的某个地方,当我存储文本和检索它时,它不再是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();

问题是retrieveText回来了吗?而不是unicode字符。

我在python中发现了类似的问题:Trying to store Utf-8 data in datastore getting UnicodeEncodeError。虽然我的应用程序没有出现任何错误。

不幸的是我认为Java字符串是默认的utf-8,我找不到任何代码可以让我明确地将它们声明为utf-8。

编辑:我现在构建了一个小型webapp,它接收unicode文本并将其存储在数据存储区中,然后检查它没有任何问题。我仍然不知道我的原始源代码中的问题在哪里,但我将改变我的代码处理网页检索的方式,以匹配我刚刚构建的较小的应用程序。感谢大家的帮助。

4 个答案:

答案 0 :(得分:3)

通过将请求和响应编码设置为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 :(得分:1)

我尝试将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());

我原本以为这解决了问题,但我错误地只在本地服务器上测试了它。这段代码还会回来吗?而不是unicode字符,这使我相信问题不在数据存储区中,而是在从app引擎传输到客户端。

答案 2 :(得分:1)

编码解决方案:导致浏览器使用"8859_1"字符集
=&GT;
前 保存数据存储区,我转换字符集。

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

当我在本地计算机上运行此应用程序时,它很好。但是当我部署时,我遇到了你看到的同样的问题。我解决了这个问题:


=&GT;保存数据存储区代码。

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

答案 3 :(得分:0)