Java 为什么JSON中的汉字会导致;错误的控制字符“;JSON.parse出错?

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"} 回

我有一个标准的HTML5类型的客户机/服务器设置。服务器端全部是Java,客户端是JavaScript。我使用ajax发送查询并接收回复。到目前为止,我在
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);