【问题标题】:Google App Engine datastore encoding?Google App Engine 数据存储区编码?
【发布时间】:2011-02-16 10:12:50
【问题描述】:

我正在将 GAE 数据存储用于 Java 应用程序,并存储一些将采用多种语言的文本。在我的 servlet 中,我首先检查数据存储中是否有任何数据,如果没有,我将创建一些,类似于以下内容:

ArrayList<Lang> list = new ArrayList<Lang>();
list.add(new Lang("EN", "English", 1));
list.add(new Lang("ES", "Español", 0));
//more languages here...

PersistenceManager pm = PMF.get().getPersistenceManager();
for(Lang l : list) {
  pm.makePersistent(l);
}

由于这是使用 JDO,我想我也应该包含 Lang 类的相关部分:

@PersistenceCapable
public class Lang {
 @PrimaryKey
 private String code;
 @Persistent
 private String name;
 @Persistent
 private int popularity;
// getters & setters & constructors...
}

但是,非 ASCII 字符让我很伤心。我已将我的 Eclipse 项目设置为使用 UTF-8 编码而不是默认的 Cp1252,所以我认为从这个角度来看我没问题,但是当我使用 App Engine 数据查看器查看我的数据,该 Español 条目变为 Español,当我单击它查看它时,我收到 500 服务器错误。 (还有一些其他的从右到左的文本条目根本不显示在数据查看器中,但一次出现一个问题......)

我可以在我的代码中做些什么特别的事情来设置字符编码,或者向 GAE 指定我存储的数据是 UTF-8 吗?或者是 Eclipse 方面的问题,我应该对我的 Java 代码做些什么?

【问题讨论】:

  • 并不是说它本身就是一个“解决方案”,但是如果我手动插入数据,使用数据查看器,它会被很好地插入,我的 servlet 从数据存储中提取数据并返回它返回数据正常。这可能成为我的解决方案;我只需要完成数据的初始加载,之后就不会更新了,所以手动加载是一种选择。虽然我更想知道为什么编码解决方案不起作用......

标签: java google-app-engine character-encoding google-cloud-datastore


【解决方案1】:

我注意到您已经将 Eclipse 项目设置为使用 UTF-8 文本编码。您是否仔细检查了包含诸如“Español”之类的字符串的 Java 文件的文本编码?

【讨论】:

    【解决方案2】:

    通过将请求和响应编码都设置为 utf-8 来修复相同的问题。请求编码导致存储在数据存储中的有效字符串,没有它的值将存储为“????...”

    请求:如果您使用 Apache HTTP 客户端,则通过以下方式完成:

    获取请求:

    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");
    

    【讨论】:

      【解决方案3】:

      几个月前我曾认为编码存在同样的问题。你可以看看我的资料,也许会有所帮助: 1)http://code.google.com/p/vocrecaptor/source/browse/trunk/vocrecaptorweb/src/com/vocrecaptor/web/server/DictionaryServiceImpl.java

      2) 和类 /com/vocrecaptor/web/server/servlet/AbstractServiceServlet.java

      【讨论】:

        【解决方案4】:

        您确定您的数据有问题吗?我之前也遇到过类似的问题,但事实证明这是数据查看器的 Python 版本中的问题。我可以在 Java 中很好地检索我的数据。

        【讨论】:

        • 是的,我确定这是数据的问题。当我通过数据查看器手动输入数据时,我看到了数据,我的应用程序也能够通过 JSON 正确地取回数据。但是当我通过 Java 代码创建数据时,它在进入数据库的过程中会出现乱码。
        • 也许你的字符串在 Java 中已经搞砸了。假设您的编辑器使用 UTF-8,但您的服务器使用 Latin-1。你会得到那个乱码。
        猜你喜欢
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多