6

我在 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.setRe​questEntityBuffering​(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 和花哨......但我仍然不知道为什么原始版本不起作用!:/

4

2 回答 2

1

我尝试使用经典的 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 和花哨......但我仍然不知道为什么原始版本不起作用!:/

于 2012-08-07T15:22:52.867 回答
0

您的回复是否包含适当的“Content-Type”标头?它应该类似于“ Content-Type: application/json; charset=UTF-8”(注意字符集)。

尝试启动您的开发服务器并使用 cURL 从命令行检索您的资源并检查标头,例如curl -i http://localhost:8080/myentity/id. 理论上浏览器应该为 JSON 假定 UTF-8,但我不相信这一点。

于 2012-03-24T12:08:50.130 回答