为什么PHP json_encode函数将UTF-8字符串转换为十六进制实体?

为什么PHP json_encode函数将UTF-8字符串转换为十六进制实体?,php,encoding,json,Php,Encoding,Json,我有一个处理各种语言的PHP脚本。不幸的是,每当我尝试使用json\u encode,任何Unicode输出都会转换为十六进制实体。这是预期的行为吗?有没有办法将输出转换为UTF-8字符 下面是我看到的一个例子: 输入 输出 База данни грешка. "\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430." 输入 输出 База данни гре

我有一个处理各种语言的PHP脚本。不幸的是,每当我尝试使用
json\u encode
,任何Unicode输出都会转换为十六进制实体。这是预期的行为吗?有没有办法将输出转换为UTF-8字符

下面是我看到的一个例子:

输入

输出

База данни грешка.
"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."
输入

输出

База данни грешка.
"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."

自PHP/5.4.0以来,有一个名为
JSON\u UNESCAPED\u UNICODE
的选项。请查看:

因此,您应该尝试:

json_encode( $text, JSON_UNESCAPED_UNICODE );

JSON_UNESCAPED_UNICODE在PHP 5.4版或更高版本上可用。
以下代码适用于5.3版

已更新

  • html\u entity\u decode
    pack
    +
    mb\u convert\u编码更高效
  • (*SKIP)(*FAIL)
    跳过反斜杠本身以及通过
    JSON\u HEX.*
    标志指定的字符

这是预期的行为吗

json\u encode()
仅适用于UTF-8编码的数据


也许您可以在这里找到转换它的答案:

一种解决方案是首先对数据进行编码,然后在同一个文件中对其进行解码:

$string =json_encode($input, JSON_UNESCAPED_UNICODE) ; 
echo $decoded = html_entity_decode( $string );

您喜欢设置字符集和未转换的unicode

 header('Content-Type: application/json;charset=utf-8');  
 json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
raw_json_encode()函数并没有解决这个问题(出于某种原因,回调函数在我的PHP5.2.5服务器上引发了一个错误)

但另一种解决方案确实有效

学分应该归你所有。我只是调用他的函数,而不是调用json_encode():


下面是我针对各种PHP版本的组合解决方案

在我的公司里,我们使用不同的服务器和不同的PHP版本,所以我必须找到适合所有人的解决方案

$phpVersion = substr(phpversion(), 0, 3)*1;

if($phpVersion >= 5.4) {
  $encodedValue = json_encode($value, JSON_UNESCAPED_UNICODE);
} else {
  $encodedValue = preg_replace('/\\\\u([a-f0-9]{4})/e', "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($value));
}

学分应转到&。PHP>=5.4的解决方案在json_编码文档中提供。

Aha。谢谢我应该更仔细地阅读文档。Thank.JSON_UNESCAPED_UNICODE是在PHP5.4.0中引入的,在早期版本中不可用。在早期版本中使用它时,会出现以下错误:“警告:json_encode()希望参数2很长,字符串在…”中给出。5.3解决方案请参见下面的部分答案。这也适用于丹麦字母Æ、æ、Ø、ø、å,谢谢!太棒了,这就是我想要的答案!你刚刚救了我的命。谢谢。\u不应该是\u,即大写吗?这是PHP<5.4;)的一个很好的解决方案我花了3天的时间寻找5.3版的解决方案,因为我的主机没有升级到5.4版。对我来说,你是一个救命恩人,因为你是如此的完整,我宁愿把这个标记为公认的答案!修复了字符串包含
\\
时的错误。较新的版本以高于
\u
的优先级获取
\
。这应该添加到php库中。干得好
function jsonRemoveUnicodeSequences( $json_struct )
{ 
    return preg_replace( "/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode( $json_struct ) );
}
json_encode($text, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
$phpVersion = substr(phpversion(), 0, 3)*1;

if($phpVersion >= 5.4) {
  $encodedValue = json_encode($value, JSON_UNESCAPED_UNICODE);
} else {
  $encodedValue = preg_replace('/\\\\u([a-f0-9]{4})/e', "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($value));
}