Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT JSON中错误的UTF-8字符串解析_Java_Json_Gwt_Utf 8 - Fatal编程技术网

Java GWT JSON中错误的UTF-8字符串解析

Java GWT JSON中错误的UTF-8字符串解析,java,json,gwt,utf-8,Java,Json,Gwt,Utf 8,我的堆栈溢出:):)我找不到解决方案 我正在开发一个服务器客户端应用程序。 我的GWT客户端正在浏览器中运行。通过以下方式与我的C++服务器通信: GWT-JSON-> LULTPCD-> LIFCFCGI> CGICC-> LBJSONS+C++应用< /P> 我的问题是: 服务器对客户端请求的JSON字符串响应。此响应包含UTF-8字符串。响应中使用“\uxxx”正确编码的重音字符。例如:“Á”编码:“\u00C3\u0081”。 客户端从JSON字符串中提取字符串。但提取的字符串包含错误的

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

我正在开发一个服务器客户端应用程序。 我的GWT客户端正在浏览器中运行。通过以下方式与我的C++服务器通信: GWT-JSON-> LULTPCD-> LIFCFCGI> CGICC-> LBJSONS+C++应用< /P> 我的问题是: 服务器对客户端请求的JSON字符串响应。此响应包含UTF-8字符串。响应中使用“\uxxx”正确编码的重音字符。例如:“Á”编码:“\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)
Alert: "ÁÉÜ" (correct)
s2="ÁÉÜ" (correct)
b2=[ 0xc3, 0x81, 0xc3, 0x89, 0xc5, 0xb0 ] (correct, same as in "response" string above)
下面是另一个测试:

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

Alert is: "ÃÉŰ" instead of "ÁÉÜ"
s1="ÃÉŰ" instead of "ÁÉÜ"
b1=[ 0xc3, 0x83, 0xc2, 0x81, 0xc3, 0x83, 0xc2, 0x89, 0xc3, 0x85, 0xc4, 0xb0 ] (incorrect)
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字符

有什么想法吗(

其他信息: 请求和响应内容类型为“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:

String s1b=new String(s1.getBytes("ISO-8859-1"));
如果我在服务器端的JSON writer中禁用“\u00xx”转义,所有操作都会按预期进行。但根据RFC4627,这不是一个好主意:((.在这种模式下,JSON字符串传输不可打印的字符(0xc3、0x81、0xc3、0x89、0xc5、0xb0)(UTF-8中的“ÁÚ”)而不进行任何编码……(:)( GWT JSON解析器正确扩展UTF-8字符,警报显示正确的字符。
我一直认为,错误的解码接近GWT JSON解码…

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

更改上面的行示例:string response=“{”测试\“:\”\\u00c1\\u00c9\\u0170\“}”;/“u193ÜÜ”在UTF-16中所有工作正常。谢谢。。