所以我有一个字符串数组,所有的字符串都使用系统默认的SQL 编码,并且都是从数据库中提取的。因此有256种不同的字符字节值(单字节编码)。
有没有一种方法可以让json_encode()
工作并显示这些字符,而不是必须在所有字符串上使用utf8_encode()
并最终得到像\u0082
这样的东西?
或者这是JSON的标准吗?
发布于 2011-07-07 15:09:02
有没有一种方法可以让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中另一个可以转换字符串编码/字符集的函数叫做基于libiconv的iconv
。您也可以使用它:
$str = iconv("CP1252", "UTF-8", $str);
关于utf8_encode()的说明
utf8_encode()
只适用于Latin-1
,不适用于ANSI
。因此,当您通过该函数运行该字符串时,您将销毁该字符串中的部分字符。
要对json_encode()
返回的内容进行更细粒度的控制,请参阅list of predifined constants (依赖于PHP版本,包括。PHP 5.4中,一些常量仍然没有文档记录,并且到目前为止在源代码中是可用的)。
更改数组的编码/迭代(PDO注释)
正如您在注释中所写的那样,将该函数应用于数组有问题,下面是一些代码示例。在使用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 );
}
发布于 2011-07-07 15:26:02
JSON标准强制使用Unicode编码。来自RFC4627
3. Encoding
JSON text SHALL be encoded in Unicode. The default encoding is
UTF-8.
Since the first two characters of a JSON text will always be ASCII
characters [RFC0020], it is possible to determine whether an octet
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
at the pattern of nulls in the first four octets.
00 00 00 xx UTF-32BE
00 xx 00 xx UTF-16BE
xx 00 00 00 UTF-32LE
xx 00 xx 00 UTF-16LE
xx xx xx xx UTF-8
因此,从最严格的意义上讲,ANSI编码的JSON不是有效的JSON;这就是为什么PHP在使用json_encode()
时强制使用unicode编码。
至于“默认ANSI",我很确定你的字符串是用Windows-1252编码的。它被错误地称为ANSI。
发布于 2015-06-10 23:39:50
<?php
$array = array('first word' => array('Слово','Кириллица'),'second word' => 'Кириллица','last word' => 'Кириллица');
echo json_encode($array);
/*
return {"first word":["\u0421\u043b\u043e\u0432\u043e","\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"],"second word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430","last word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"}
*/
echo json_encode($array,256);
/*
return {"first word":["Слово","Кириллица"],"second word":"Кириллица","last word":"Кириллица"}
*/
?>
JSON_UNESCAPED_UNICODE (整数)对多字节Unicode字符进行字面编码(默认转义为\uXXXX)。从PHP 5.4.0开始可用。
http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode
https://stackoverflow.com/questions/6606713
复制相似问题