【发布时间】:2012-08-08 02:46:44
【问题描述】:
我正在寻找有关应用引擎如何处理字符编码的一些解释。我正在开发一个客户端-服务器应用程序,其中服务器位于应用引擎上。
这是一个从头开始构建的新应用程序,因此我们在所有地方都使用 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 编码的字符串非常好。这也不是误解 Content-Type 的问题。这不是客户端。一路走来正确识别我正在发送 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”,但这并没有改变任何内容。
提前致谢,
【问题讨论】:
-
我不了解 GAE,但您的 API 看起来像 J2EE Servlets。那里 ISO-8859-1 确实是默认值。使用
resp.setCharacterEncoding()更改编码或直接打印二进制文件。 -
GAE 使用相同的 API。我已经尝试在响应中设置字符编码,它不起作用。 :( 不过谢谢。
-
我根本没有使用过 appengine,但是对于所有 appserver,我必须实现一个过滤器来强制编码为 UTF-8(因为 Zeiss 提到的“问题”......愚蠢的 servlet规格)。如果您不想重新发明轮子,可以从tomcat 复制粘贴过滤器。
-
@Augusto:不,我没有尝试过。我看到的链接使用 Spring,我没有使用 Spring。您的链接未在此处加载。我在其他地方找到了该代码,我会试一试并回复您,谢谢。
标签: java google-app-engine servlets character-encoding