我在 AppEngine 上托管了一个简单的 Restlet 服务。这对字符串执行基本的 CRUD 操作,并且当我使用 curl 测试它(对于所有动词)时,它可以很好地处理各种 UTF-8 字符。
这由托管在另一个 AppEngine 应用程序的 servlet 中的简单 restlet 客户端使用:
// set response type
resp.setContentType("application/json");
// Create the client resource
ClientResource resource = new ClientResource(Messages.SERVICE_URL + "myentity/id");
// Customize the referrer property
resource.setReferrerRef("myapp");
// Write the response
resource.get().write(resp.getWriter());
以上几乎就是我在 servlet 中的所有内容。很朴实。
servlet 是通过 jquery ajax 调用的,我得到的 json 格式正确,一切都很好,但问题是 UTF-8 编码的字符串回来打乱了,例如:
Université de Montréal
变成Universit?? de Montr??al
.
我尝试在 servlet 中添加这一行(在其他所有内容之前):
resp.setCharacterEncoding("UTF-8");
但唯一的区别是,我得到的不是??
我得到的Universitᅢᄅ de Montrᅢᄅal
(我什至不知道那些是什么类型的角色,我想是亚洲人)。
我 100% 确定 restlet 服务没问题,因为除了逐行调试它之外,我还可以使用 curl 从 cmd 行对其进行测试,并且它返回格式良好的字符串。
通过查看来自 firefox 的响应的 http 标头(通过 javascript 调用 servlet 时),我可以看到编码确实是 UTF-8,正如预期的那样。经过数小时努力阅读所有可能的相关文章后,我遇到了这个 restlet 讨论 ,并注意到我确实Transfer-Encoding: chunked
在响应的 http 标头上有。我尝试了建议的解决方案(覆盖 ClientResource.toRepresentation,没有任何好处,所以我尝试了 restlet 2.1,因为 susggested ClientResource.setRequestEntityBuffering(true)
,也没有运气),但我不相信我的问题 与Transfer-Encoding: chunked
.
在这一点上,我没有想法,我真的很感激任何建议!o_o
更新:
我尝试使用经典的 UrlConnection 进行手动 GET,字符串恢复正常:
URL url = new URL(Messages.SERVICE_URL + "myentity/id");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
resp.getWriter().print(writer.toString());
如此多的 RESTful 和花哨......但我仍然不知道为什么原始版本不起作用!:/