我正在使用php的json_encode()将数组转换为json,然后回显它并从javascript ajax请求中读取。
问题是echo'd文本有unicode字符,javascript json parse()函数没有转换为。
示例数组值为“2 \ u00000 \ u00000 \ u0000 \ u0000 \ u00000 \ u00000 \ u0000 \ u00000 \ u00001”,即“2010-10-01”。
Json.parse()只给我“2”。
有人帮我解决这个问题吗?
示例:
var resArray = JSON.parse(this.responseText);
for(var x=0; x < resArray.length; x++) {
var twt = resArray[x];
alert(twt.date);
break;
}
答案 0 :(得分:1)
字符串中有NUL个字符(字符代码为零)。它实际上是"2_0_1_0_-_1_0_-_0_1"
,其中_
代表NUL字符。
unicode字符转义实际上是JSON标准的一部分,因此解析器应该正确处理它。但是,结果仍然是字符串中的NUL字符,所以当你尝试在Javascript中使用字符串时,行为将取决于浏览器对NUL字符的作用。
您可以在不同的浏览器中尝试此操作:
alert('as\u0000df');
Internet Explorer将仅显示as
Firefox将显示asdf
,但不会显示NUL字符。
最好的解决方案是在将数据转换为JSON之前删除NUL字符。
答案 1 :(得分:1)
再加上Guffa所说的话:
当您有零字节交替时,几乎可以肯定的是,您已经读取了UTF-16数据源,而没有将其转换为ASCII兼容编码,如UTF-8。虽然您可以丢弃空值,但如果它包含ASCII范围之外的任何字符,则会破坏该字符串。 (当然,日期字符串不是问题,但它可能会影响您从同一来源读取的任何其他字符串。)
检查您的PHP代码从哪里读取2010-10-01
字符串,并使用例如iconv('utf-16le', 'utf-8', $string)
动态转换,或更改源以使用更合理的编码。例如,如果它是文本文件,则使用“UTF-8无BOM”保存在文本编辑器中,而不是“Unicode”,这是Windows文本编辑器用来表示UTF-16LE的极具误导性的名称。