有没有办法让 json_encode() 工作并显示这些字符,而不是必须在所有字符串上使用 utf8_encode() 并最终得到诸如“\u0082”之类的内容?
如果您有 ANSI 编码的字符串,请使用utf8_encode()
is the wrong函数来处理这个问题。您需要先将其从 ANSI 正确转换为 UTF-8。这肯定会减少 Unicode 转义序列的数量,例如\u0082
来自 json 输出,但从技术上讲这些序列对 json 有效 http://www.ietf.org/rfc/rfc4627.txt,你一定不要害怕他们。
使用 PHP 将 ANSI 转换为 UTF-8
json_encode http://php.net/manual/en/function.json-encode.php与UTF-8
编码字符串only。如果您需要创建有效的json
成功地从ANSI
编码字符串,您需要将其重新编码/转换为UTF-8
第一的。然后json_encode
将按照记录工作。
转换编码ANSI
(更正确地说,我假设你有一个Windows-1252
编码字符串,很流行但被错误地称为ANSI
) to UTF-8
你可以利用mb_convert_encoding() http://php.net/manual/en/function.mb-convert-encoding.php功能:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
PHP 中另一个可以转换字符串的编码/字符集的函数称为iconv http://php.net/manual/en/function.iconv.php基于libiconv http://www.gnu.org/software/libiconv/。您也可以使用它:
$str = iconv("CP1252", "UTF-8", $str);
关于 utf8_encode() 的注意事项
utf8_encode() http://php.net/manual/en/function.utf8-encode.php只适用于Latin-1
, 不是为了ANSI
。因此,当您通过该函数运行该字符串时,您将破坏该字符串内的部分字符。
有关的:什么是 ANSI 格式? https://stackoverflow.com/questions/701882/what-is-ansi-format
为了更细粒度地控制什么json_encode()
返回,请参阅预定义常量列表 http://www.php.net/manual/en/json.constants.php(取决于 PHP 版本,包括 PHP 5.4,一些常量仍未记录在案,到目前为止仅在源代码中可用)。
更改数组的编码/迭代(PDO 注释)
正如您在评论中所写的,您在将函数应用到数组时遇到问题,这里是一些代码示例。它是always需要first使用前更改编码json_encode
。这只是一个标准的数组操作,对于更简单的情况pdo::fetch()
a 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 );
}