Java 为什么JSON中的汉字会导致;错误的控制字符“;JSON.parse出错?
我有一个标准的HTML5类型的客户机/服务器设置。服务器端全部是Java,客户端是JavaScript。我使用ajax发送查询并接收回复。到目前为止,我在Java 为什么JSON中的汉字会导致;错误的控制字符“;JSON.parse出错?,java,javascript,json,jquery,utf-8,Java,Javascript,Json,Jquery,Utf 8,我有一个标准的HTML5类型的客户机/服务器设置。服务器端全部是Java,客户端是JavaScript。我使用ajax发送查询并接收回复。到目前为止,我在JSON.parse(data)方面没有遇到任何问题。然而,我有一个新用户,她用汉字输入了她的姓氏。这导致客户端出现“JSON.parse:string literal中的错误控制字符”错误 服务器按如下方式生成回复(省略异常处理): 客户机会收到如下信息: {"last_name":"Smith","first_name":"Bob"} 回
JSON.parse(data)
方面没有遇到任何问题。然而,我有一个新用户,她用汉字输入了她的姓氏。这导致客户端出现“JSON.parse:string literal中的错误控制字符”错误
服务器按如下方式生成回复(省略异常处理):
客户机会收到如下信息:
{"last_name":"Smith","first_name":"Bob"}
回复显示在设置为
的网页上:
这个很好用。但是,对于中国用户,客户端接收
{"last_name":"唐","first_name":"Bob"}
这会导致json.parse错误
我现在开始看其他角色。例如,Andrés
不会导致错误,但也不会正确显示。看起来像是安德烈�s
所以,我显然遗漏了一些东西。有人能告诉我问题在哪里(例如,是服务器端吗?客户端吗?JavaScript?jquery?html?)以及如何解决它吗?我用过的Java中最有用的库是
Gson API
,两者都可以处理这个问题,如果你这样做,你的问题可能会得到解决。请注意,此处所有与utf-8相关的参数都非常重要:
JSONObject jsono = new JSONObject();
jsono.put("last_name", "唐");
jsono.put("first-name", firstName);
String myjsonString = jsono.toString();
//write your output
DataOutputStream out = new DataOutputStream(new FileOutputStream("myjson.txt"));
out.write(myjsonString.getBytes("utf-8"),0, myjsonString.getBytes("UTF-8").length);
实际上这不是JavaScript问题,我认为您在服务器端使用Java,它与
JSONObject API
相关,而不是客户端,如果您真的使用Java,请添加标记,然后等待我的回答。正如Mehran所说,这不是JSON或JavaScript。这几乎肯定是一个编码问题。如果编码是正确的,并且所有人都知道该编码是什么,那么就可以了。(例如:)。例如,如果使用Windows-1252字符集(或UTF-16,或…)而不是UTF-8将JSON返回到浏览器,我添加了[java]标记。服务器端都是Java。生产版本在Linux上运行;我的开发版本在Mac上运行。如何为客户端编写响应
?我首先编写头信息(HTTP/1.0 200 OK连接:关闭服务器:服务器名内容类型:text/html
),然后尝试{output.writeBytes(响应)既然你提到了它,我怀疑text/html
是相关的。还没有完全工作。我正在使用DataOutputStream
(称为out
)返回响应。我已经添加了头out.writeBytes(“字符编码:utf-8”);
和out.writeBytes(“内容类型:application/json;charset=utf-8”)
。然后我调用out.write(myjsonString.getBytes(“UTF-8”)、0、myjsonString.getBytes(“UTF-8”).length)在控制台中,发送回来的对象看起来很好,但这会产生一个JSON.parse:unexpected character
error.OK,它正常工作了,但不明白为什么!我将http头改回txt/html,但保留了out.write(myjsonString.getBytes(“UTF-8”)、0、myjsonString.getBytes(“UTF-8”).length);
语句。现在,汉字和重音e都显示出来了。这都是关于java web服务器如何做出HTTP响应的,这里最重要的是使用正确的字符编码。祝你圣诞快乐。:)向下投票,因为我认为OP没有使用servlet API,这在回答中给出了。DataOutputStream#writeBytes
只从字符串中写入第一个(较低)字节,这就是问题的症结所在。@Pavel Horal:谢谢你的评论和否决,我已经更新了我的答案。
{"last_name":"唐","first_name":"Bob"}
JSONObject jsono = new JSONObject();
jsono.put("last_name", "唐");
jsono.put("first-name", firstName);
String myjsonString = jsono.toString();
//write your output
DataOutputStream out = new DataOutputStream(new FileOutputStream("myjson.txt"));
out.write(myjsonString.getBytes("utf-8"),0, myjsonString.getBytes("UTF-8").length);