为什么以下代码: 的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字符替换为真实字符。为什么呢?
答案 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;字节解释在您的应用程序中发生的其他可能位置。