0

为什么下面的代码: var_dump(json_decode('"\u201A"')); echo json_decode('"\u201A"');

打印:

string(3) "‚"
‚

代替:

string(1) "‚"
‚

是 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 字符。为什么?

4

1 回答 1

1

当您','直接在源文件中写入时,您正在编写一串字节,这取决于您的文本编辑器中使用的编码。从我可以看到您的文本编辑器正在使用 Windows-1252/"ANSI" IE,您正在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");

接下来是数据库传输存储编码(分开的东西),以及其他可能在您的应用程序中发生文本<->字节解释的地方。

于 2013-04-13T23:16:29.423 回答