首页 文章

PHP解码和编码带有unicode字符的json

提问于
浏览
30

我有一些json我需要解码,更改然后编码而不会弄乱任何字符 .

如果我在json字符串中有一个unicode字符,它将无法解码 . 我不确定为什么因为json.org说字符串可以包含: any-Unicode-character- except-"-or-\-or- control-character . 但它在python中也不起作用 .

{"Tag":"Odómetro"}

我可以使用utf8_encode,它允许使用json_decode对字符串进行解码,但是该字符会被破坏成其他内容 . 这是结果数组的print_r的结果 . 两个字符 .

[Tag] => Odómetro

当我再次对数组进行编码时,我将字符转义为ascii,根据json规范这是正确的:

"Tag"=>"Od\u00f3metro"

有什么方法可以解除这个吗? json_encode没有给出这样的选项,utf8_encode似乎也没有用 .

Edit 我看到json_encode有一个unescaped_unicode选项 . 然而它只在php 5.4上发布了.2926743_ s . 我将不得不使用一些正则表达式,因为我只有5.3 .

$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...

7 回答

  • 14

    从你所说的一切来看,你所处理的原始字符串似乎是用ISO 8859-1编码的,而不是UTF-8 .

    这就是为什么我这么认为:

    通过 utf8_encode 运行输入字符串后,

    • json_encode 生成了可解析输出,该字符串从ISO 8859-1转换为UTF-8 .

    • 你确实说在执行 utf8_encode 之后使用 print_r 时输出了"mangled",但你得到的错误输出实际上是试图解析UTF-8文本为ISO 8859-1(ó是UTF-8中的 \x63\xb3 ,但该序列在ISO 8859-1中是 ó .

    • 您的 htmlentities 黑客解决方案有效 . htmlentities 需要知道输入字符串的编码才能正常工作 . 如果未指定,则采用ISO 8859-1 . ( html_entity_decode ,令人困惑,默认为UTF-8,因此您的方法具有从ISO 8859-1转换为UTF-8的效果 . )

    • 你说你在Python中遇到了同样的问题,这似乎排除了PHP的问题 .

    PHP将使用 \uXXXX 转义,但正如您所指出的,这是有效的JSON .

    因此,您似乎需要配置与Postgres的连接,以便它为您提供UTF-8字符串 . PHP手册指示您通过将 options='--client_encoding=UTF8' 附加到连接字符串来执行此操作 . 当前存储在数据库中的数据也可能是错误的编码 . (您可以简单地使用 utf8_encode ,但这仅支持属于ISO 8859-1的字符) .

    最后,正如另一个答案所指出的,你确实需要确保使用HTTP标头或其他方式声明正确的字符集(当然,这个特定的问题可能只是你进行 print_r 测试的环境的工件) .

  • 28

    我找到了以下方法来解决这个问题...我希望这可以帮到你 .

    json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
    
  • 4

    在PHP 5.4中添加了JSON_UNESCAPED_UNICODE,因此看起来您需要升级您的PHP版本才能利用它 . 5.4虽然尚未发布! :(

    如果您想在开发机器上玩游戏,那么QA上有一个5.4 alpha release candidate .

  • 16

    在PHP 5.3中执行JSON_UNESCAPED_UNICODE的一种hacky方式 . 对PHP json支持感到非常失望 . 也许这会帮助别人 .

    $array = some_json();
    // Encode all string children in the array to html entities.
    array_walk_recursive($array, function(&$item, $key) {
        if(is_string($item)) {
            $item = htmlentities($item);
        }
    });
    $json = json_encode($array);
    
    // Decode the html entities and end up with unicode again.
    $json = html_entity_decode($rson);
    
  • 3

    尝试在页面中设置 utf-8 编码:

    header('content-type:text/html;charset=utf-8');
    

    这对我有用:

    $arr = array('tag' => 'Odómetro');
    $encoded = json_encode($arr);
    $decoded = json_decode($encoded);
    echo $decoded->{'tag'};
    
  • 6

    尝试使用:

    utf8_decode() and utf8_encode
    
  • 3
    $json = array('tag' => 'Odómetro'); // Original array
    $json = json_encode($json); // {"Tag":"Od\u00f3metro"}
    $json = json_decode($json); // Od\u00f3metro becomes  Odómetro
    echo $json->{'tag'}; // Odómetro
    echo utf8_decode($json->{'tag'}); // Odómetro
    

    你很亲密,只需使用utf8_decode .

相关问题