为什么json_decode会返回奇怪的字符?

时间:2013-04-13 22:12:18

标签: php unicode

为什么以下代码:     的var_dump(json_decode( ' “\ u201A”'));     echo json_decode('“\ u201A”');

打印出来:

string(3) "‚"
‚

而不是:

string(1) "‚"
‚

Here是unicode页面的链接。

此外,这可能不是浏览器显示问题:请注意PHP输出如何表示有三个字符。

此外:

var_dump(str_split(json_decode('"\u201A"')));

输出:

array(3) {
  [0]=>
  string(1) "â"
  [1]=>
  string(1) "€"
  [2]=>
  string(1) "š"
}

在上下文中:

$unicodeChar = '\u201A';
$value = str_replace(json_decode('"'.$unicodeChar.'"'), ',', $value);

不会将unicode字符替换为真实字符。为什么呢?

1 个答案:

答案 0 :(得分:1)

当您在源文件中直接编写','时,您正在编写一个字节字符串,这取决于文本编辑器中使用的编码。从我可以看到你的文本编辑器使用Windows-1252 /“ANSI”I.E。您正在文件中写入0x82字节。

PHP字符串是具有非托管编码的字节数组,所以任何事情都可以。

json_decode以UTF-8返回结果,因此PHP字符串中的低引号为3个字节:0xE2 0x80 0x9A

所以你试图取代0x82并且没有匹配,你可以看到。

您可以通过以下代码看到这一点:

<?php
$win1252 = ",";
$utf8 = json_decode('"\u201A"');
echo bin2hex($win1252) . "\n<br>";
echo bin2hex($utf8);

为避免头痛,您必须始终使用单一编码。否则,为了正确处理,您将最终得到无处不在的转换代码或令人尴尬的字符编码错误。我建议选择UTF-8,因为json_*不能用于其他任何原因。

您需要做的第一件事是将文本编辑器设置为以UTF-8保存文件并为浏览器声明UTF-8:

header("Content-Type: text/html; charset=UTF-8");

接下来是数据库传输存储编码(单独的东西),以及文本&lt; - &gt;字节解释在您的应用程序中发生的其他可能位置。