0

我的堆栈溢出了:):):):) 我找不到解决方案...

我正在开发一个服务器-客户端应用程序。我的 GWT 客户端在浏览器中运行。通过以下方式与我的 C++ 服务器通信:GWT-JSON -> lighttpd -> libfcgi -> cgicc -> libjson -> C++ 应用程序

我的问题:服务器对客户端请求的响应是 JSON 字符串。此响应包含 UTF-8 字符串。用“\uXXXX”正确编码的重音字符作为响应。例如:“Á”编码:“\u00C3\u0081”。客户端从 JSON 字符串中提取字符串。但是提取的字符串包含错误的编码字符。:(:(:(:(

幸运的是,我可以将问题缩小到 JSON-GWT。这是一个演示问题的代码,仅在 GWT 中在客户端运行:

String response="{ \"test\" : \"\\u00C3\\u0081\\u00C3\\u0089\\u00C5\\u00B0\" }"; //"ÁÉÜ" in UTF-8
JSONObject json=JSONParser.parseStrict(response).isObject();
String s1=json.get("test").isString().stringValue();
Window.alert(s1);
byte[] b1=s1.getBytes();

结果:

Alert is: "ÃÉŰ" instead of "ÁÉÜ"
s1="ÃÉŰ" instead of "ÁÉÜ"
b1=[ 0xc3, 0x83, 0xc2, 0x81, 0xc3, 0x83, 0xc2, 0x89, 0xc3, 0x85, 0xc4, 0xb0 ] (incorrect)

这是另一个测试:

String s2="ÁÉŰ";
Window.alert(s2);
byte[] b2=s2.getBytes();

结果:

Alert: "ÁÉÜ" (correct)
s2="ÁÉÜ" (correct)
b2=[ 0xc3, 0x81, 0xc3, 0x89, 0xc5, 0xb0 ] (correct, same as in "response" string above)

我认为, JSONParser.parseStrict 或 JSONObject.get().isString().stringValue() 无法正确处理 UTF-8 字符...

任何想法?:(:(:(:(

附加信息:请求和响应 Content-Type 为“application/json; charset=UTF-8”。源代码文件和开发环境使用 UTF-8。浏览器编码的 HTML 页面也是 UTF-8。

我只对响应有问题。请求字符编码/编码正确。

谢谢你的帮助,蒂博尔

更新1:

String s1b=new String(s1.getBytes("ISO-8859-1"));

返回:s1b="ÁÉÜ"(正确)

这很丑陋,也很奇怪。为什么我需要将 UTF-8 字符串转换为 ISO-8859-1 才能再次获得 UTF-8 字符串?我不明白... :(:(:(

更新2:

如果我在服务器端的 JSON 编写器中禁用“\u00xx”转义,一切都会按预期工作。但是根据 RFC4627 这不是一个好主意 :((((。在这种模式下,JSON 字符串传输不可打印的字符 (0xc3, 0x81, 0xc3, 0x89, 0xc5, 0xb0) ("ÁÉÚ" in UTF-8 ) 没有任何编码.... :(:(:( GWT JSON解析器正确扩展了UTF-8字符,并且警报显示正确的字符。我一直认为,错误的解码接近GWT JSON解码...

4

1 回答 1

0

你的服务器坏了;它没有正确使用 JSON。JSON 中的 Unicode 转义对应于 UTF-16 代码单元,因此Á应编码为\u00c1而不是您引用的 2 字符字符串。

于 2013-05-30T11:35:18.173 回答