有没有办法让 json_encode() 工作并显示这些字符,而不必在我的所有字符串上使用 utf8_encode() 并以“\u0082”之类的东西结束?
如果你有一个 ANSI 编码的字符串,使用utf8_encode() 是错误 函数来处理这个问题。您需要先将其从 ANSI 正确转换为 UTF-8。这肯定会减少 json 输出中像 \u0082 这样的 Unicode 转义序列的数量,但从技术上讲,这些序列 are valid for json,你不必害怕它们。
使用 PHP 将 ANSI 转换为 UTF-8
json_encode 适用于UTF-8 编码字符串仅。如果您需要从ANSI 编码的字符串成功创建有效的json,则需要先将其重新编码/转换为UTF-8。然后json_encode 将按文档说明工作。
要将编码从ANSI(更准确地说,我假设您有一个Windows-1252 编码字符串,它很流行但被错误地称为ANSI)转换为UTF-8,您可以使用mb_convert_encoding()功能:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
PHP 中另一个可以转换字符串的编码/字符集的函数称为iconv,基于libiconv。你也可以使用它:
$str = iconv("CP1252", "UTF-8", $str);
关于 utf8_encode() 的注意事项
utf8_encode() 仅适用于 Latin-1,不适用于 ANSI。因此,当您通过该函数运行它时,您将破坏该字符串中的部分字符。
相关:What is ANSI format?
如需对json_encode() 返回的内容进行更细粒度的控制,请参阅list of predifined constants(取决于 PHP 版本,包括 PHP 5.4,一些常量未记录,仅在源代码中可用)。
更改数组的编码/迭代(PDO 注释)
正如您在评论中写道,将函数应用于数组时遇到问题,这里有一些代码示例。在使用json_encode 之前,总是需要首先更改编码。这只是一个标准的数组操作,对于 pdo::fetch() 和 foreach 迭代这样更简单的情况:
while($row = $q->fetch(PDO::FETCH_ASSOC))
{
foreach($row as &$value)
{
$value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
}
unset($value); # safety: remove reference
$items[] = array_map('utf8_encode', $row );
}