首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >json_encode()非utf-8字符串?

json_encode()非utf-8字符串?
EN

Stack Overflow用户
提问于 2011-07-07 14:30:36
回答 6查看 39.5K关注 0票数 29

所以我有一个字符串数组,所有的字符串都使用系统默认的SQL 编码,并且都是从数据库中提取的。因此有256种不同的字符字节值(单字节编码)。

有没有一种方法可以让json_encode()工作并显示这些字符,而不是必须在所有字符串上使用utf8_encode()并最终得到像\u0082这样的东西?

或者这是JSON的标准吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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()函数:

代码语言:javascript
复制
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

PHP中另一个可以转换字符串编码/字符集的函数叫做基于libiconviconv。您也可以使用它:

代码语言:javascript
复制
$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() a foreach迭代的简单情况:

代码语言:javascript
复制
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 );
}
票数 35
EN

Stack Overflow用户

发布于 2011-07-07 15:26:02

JSON标准强制使用Unicode编码。来自RFC4627

代码语言:javascript
复制
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。

票数 10
EN

Stack Overflow用户

发布于 2015-06-10 23:39:50

代码语言:javascript
复制
<?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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6606713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档