当前位置: 首页 > 知识库问答 >
问题:

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

柳逸春
2023-03-14

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

以下是我所看到的示例:

输入

echo $text;

输出

База данни грешка.

输入

json_encode($text);

输出

"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430."

共有3个答案

金昂熙
2023-03-14

你喜欢设置字符集和未转义的 unicode

 header('Content-Type: application/json;charset=utf-8');  
 json_encode($data,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
鞠子轩
2023-03-14

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

已更新

    < Li > < code > html _ entity _ decode 比< code > pack < code > MB _ convert _ encoding 更有效一点。 < li> (*SKIP)(*FAIL)跳过反斜杠本身和由< code>JSON_HEX_*标志指定的字符。
function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}
丘学海
2023-03-14

自PHP/5.4.0以来,有一个名为JSON_UNESCAPED_UNICODE的选项。过来看:

https://php.net/function.json-encode

因此,您应该尝试:

json_encode( $text, JSON_UNESCAPED_UNICODE );
 类似资料:
  • 问题内容: 我有一个处理多种语言的PHP脚本。不幸的是,每当我尝试使用时,任何Unicode输出都将转换为十六进制实体。这是预期的行为吗?有什么方法可以将输出转换为UTF-8字符? 这是我所看到的示例: 输入 输出值 输入 输出值 问题答案: 从PHP / 5.4.0开始,有一个名为的选项。一探究竟: http://se2.php.net/json_encode 因此,您应该尝试:

  • 问题内容: 要将String转换为十六进制,我正在使用: 在此处投票最高的答案中对此进行了概述:在Java中将 字符串转换为十六进制 我该如何反向执行,即将十六进制转换为字符串? 问题答案: 您可以从转换后的字符串中进行重构,这是一种实现方法: 另一种方法是使用,从包: 单元测试以验证: 注:领先剥离的仅仅是必要的,因为的你的填充方法。如果您不介意将其替换为简单的,则可以将此行放在:

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1

  • 我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?

  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何dll或其他库来将十六进制数据发送和接收到串行端口设备。我的代码如下。 问题答案: 十六进制: 十六进制为: