json_encode假定其输入中的字符串是有效的 UTF-8(请记住,PHP 字符串是字节序列,而不是 Unicode 代码点序列)。如果您的文本编辑器未设置为使用该编码(并且您没有使用十六进制转义码手动生成 UTF-8,例如\xc2\xb0
在双引号字符串中),则该字符串将被编码为null
(因为它不是有效的 UTF -8)。
其他常见的字符集如Windows-1252也是 ASCII 的超集,因此只有在存在任何非 ASCII 字符(包括 U+00B0 DEGREE SIGN)时才会出现问题。
即使字符串是有效的 UTF-8,默认情况下,json_encode 也会输出\u00b0
而不是实际的度数符号。对于使用 PHP json_decode或 JavaScript JSON.parse进行编程解码,这不是问题,它们可以理解 JSON 十六进制转义序列。
(在 PHP 5.4 中,有一个JSON_UNESCAPED_UNICODE
标志可以防止这种转义。但是,许多 Web 服务器仍然具有 PHP 5.3 或更早版本,并且该标志甚至可以取消转义有问题的字符 U+2028 LINE SEPARATOR 和 U+2029 PARAGRAPH SEPARATOR。可以用两行代码模拟标志,尽管正如我上面解释的那样,无论如何您都不必这样做。)