我正在构建一个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文本并将其存储在数据存储区中,然后检查它没有任何问题。我仍然不知道我的原始源代码中的问题在哪里,但我将改变我的代码处理网页检索的方式,以匹配我刚刚构建的较小的应用程序。感谢大家的帮助。
答案 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)