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

fnf*_*fnf 15 java google-app-engine servlets character-encoding

我正在寻找关于app引擎如何处理字符编码的一些解释.我正在研究服务器在app引擎上的客户端 - 服务器应用程序.

这是一个从头开始构建的新应用程序,因此我们在任何地方都使用UTF-8.客户端通过POST,x-www-form-urlencoded向服务器发送一些字符串.我收到它们并回复它们.当客户收回它时,它是ISO-8859-1!在POST到blobstore时我也看到了这种行为,参数发送为UTF-8,multipart/form-data编码.

为了记录,我在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);
}
Run Code Online (Sandbox Code Playgroud)

我尝试设置响应的字符编码并请求"UTF-8",但这并没有改变任何东西.

提前致谢,

use*_*245 17

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

1)在appengine-web.xml中将system-properties(如果使用它)设置为utf8

<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>
Run Code Online (Sandbox Code Playgroud)

好的,上面是我的,但文档建议如下:

<env-variables>
    <env-var name="DEFAULT_ENCODING" value="UTF-8" />
</env-variables>
Run Code Online (Sandbox Code Playgroud)

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

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

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

我试试

resp.setContentType("application/json; charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)

您还可以尝试使用编写器直接设置内容类型.

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以上,它的工作原理.


fnf*_*fnf 7

找到了解决它的方法.我就这样做了:

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

  • Base64编码的输入字符串不是ASCII安全的,并且是UTF-8.否则,当他们到达servlet时,他们会转换为ISO-8859-1.

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

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