Javascript 如何在XMLHttpRequest中正确发送/接收Unicode

Javascript 如何在XMLHttpRequest中正确发送/接收Unicode,javascript,apache,unicode,Javascript,Apache,Unicode,我试图使用XMLHttpRequest将包含·字符的字符串发送到服务器。我使用以下代码在javascript代码中设置内容类型: xmlhttpreq.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8") 现在,如果我查找·的实际UTF-8值,例如使用类似于或的页面,它告诉我该值应该是183,或者0xC2 0xB7作为UTF-8十六进制字节。我看到后者被发送到服务器。服务器返回此

我试图使用XMLHttpRequest将包含
·
字符的字符串发送到服务器。我使用以下代码在javascript代码中设置内容类型:

xmlhttpreq.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8")
现在,如果我查找
·
的实际UTF-8值,例如使用类似于或的页面,它告诉我该值应该是183,或者0xC2 0xB7作为UTF-8十六进制字节。我看到后者被发送到服务器。服务器返回此数据时,将其编码为字符串“\u00C2\u00B7”或文字字节0x5C 0x75 0x30 0x30 0x43 0x32 0x5C 0x75 0x30 0x30 0x42 0x37。响应被传递到
JSON.parse(xmlhttpreq.responseText)
,后者将其转换为
·
。额外的
来自哪里


页面是UTF-8,XMLHttpRequest是UTF-8,document.codeset是UTF-8,服务器响应是UTF-8。

这是关于URL编码的问题,而不是文本编码的问题。请阅读:


您必须在纯C CGI中进行URL解码。

根据与Ryan O'Hara在聊天中的讨论,问题在于JSON是UTF-16,而不是UTF-8。因此,服务器需要生成UTF-16字符串,这最好通过使用JSON库来实现。在我的例子中,我使用了这个简单的jansson片段:

json_dumpf(json_string(str),stdout,JSON_ENCODE_ANY);

·
是一个字符,所以它当然只有一个字符(字符串
“·”
没有第二个字符)!但这并不能告诉您它占用了多少字节。@immibis是对的,但我读到某些unicode字符(我想在0x10000以上)要求您调用charCodeAt(1)来获取代码的高位。
charCodeAt()
返回UTF-16短字符,因此对于在UTF-16中仅编码为两个字节的任何字符,您只能看到一个值(这
·
是)。正确的处理方法是让所有部件都接受UTF-8。@RyanO'Hara是正确的,但不应该将代码页设置为UTF-8(
在最初提供的页面中,以及
xmlhttp.setRequestHeader(“内容类型”,“字符集=UTF-8”);
在XMLHttpRequest中是否足以做到这一点?即使使用这两种方法,我仍然看到浏览器将字符编码为
%C2%B7
,而不仅仅是
%B7
。我不明白为什么额外的
%C2
。WP条目有些不完整。随着欧元的引入(
),ISO-LATIN-15变得比-1更相关。一般来说,iff(!)你必须使用ISO-8859,对于西方语言,-15是更好的选择。不,JSON也可以用UTF-8编码。至少Wikipedia和Facebook会用这种编码发送JSON文件。当然,还有StackOverflow。你可以转到,单击,并验证响应实际上编码为UTF-8