有没有办法将 UTF-8 与应用引擎一起使用?

我正在寻找有关应用程序引擎如何处理字符编码的一些解释。我正在处理一个客户端 - 服务器应用程序,其中服务器位于应用程序引擎上。

这是一个从头开始构建的新应用程序,因此我们在任何地方都使用 UTF-8。客户端通过 POST(x-www-form-urlencoded)将一些字符串发送到服务器。我收到它们并回声。当客户拿回它时,它是ISO-8859-1!在POS到blobstore时,我也看到了这种行为,参数以UTF-8的形式发送,多部分/表单数据编码。

为了记录在案,我在Wireshark中看到了这一点。所以我100%确定我发送UTF-8并接收ISO-8859-1。另外,我没有看到mojibake:ISO-8859-1编码的字符串完全没问题。这也不是误解内容类型的问题。它不是客户端。在此过程中,某些内容正确识别我正在发送 UTF-8 参数,但由于某种原因将它们转换为 ISO-8859-1。

我被引导相信ISO-8859-1是GAE servlet的默认字符编码。我的问题是,有没有办法告诉GAE不要转换为ISO-8859-1,而是在任何地方使用UTF-8?

假设 servlet 执行如下操作:

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    resp.setContentType("application/json");
    String name = req.getParameter("name");
    String json = "{\"name\":\"" + name + "\"}";
    resp.getOutputStream().print(json);
}

我尝试将响应和请求的字符编码设置为“UTF-8”,但这并没有改变任何东西。

提前致谢,


答案 1

我看到你应该做的两件事。

1)在你的 appengine-web 中将系统属性(如果你正在使用它)设置为 utf8.xml

<system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
    <property name="file.encoding" value="UTF-8" />
    <property name="DEFAULT_ENCODING" value="UTF-8" />
</system-properties>

好吧,以上是我所拥有的,但文档在下面建议:

<env-variables>
    <env-var name="DEFAULT_ENCODING" value="UTF-8" />
</env-variables>

https://developers.google.com/appengine/docs/java/config/appconfig

2)在设置内容类型时指定编码,否则它将恢复为默认值

内容类型可以包括所使用的字符编码类型,例如,text/html;字符集 = ISO-8859-4。

我会尝试

resp.setContentType("application/json; charset=UTF-8");

您还可以尝试使用一个作家,它可以让您直接将内容类型设置为它。


http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse.html#getWriter%28%29 http://docs.oracle.com/javaee/1.3/api/javax/servlet/ServletResponse.html#setContentType(java.lang.String)

就其价值而言,我需要utf8用于日语内容,我没有遇到任何问题。无论如何,我没有使用过滤器或setContentType。我正在使用上面的gwt和#1,它的工作原理。


答案 2

找到了一种解决方法。我是这样做到的:

  • 使用“application/json;charset=UTF-8“ 作为内容类型。或者,将响应字符集设置为“UTF-8”(两者都可以正常工作,无需同时执行这两项操作)。

  • Base64 编码的输入字符串不是 ASCII 安全且以 UTF-8 形式出现的。否则,显然,当他们到达servlet时,它们会转换为ISO-8859-1。

  • 使用 resp.getWriter() 而不是 resp.getOutputStream() 来打印 JSON 响应。

在满足所有这些条件后,我终于能够将UTF-8输出回客户端。


推荐