【问题标题】:Json_encode Charset problemJson_encode字符集问题
【发布时间】:2010-06-14 06:58:13
【问题描述】:

当我使用 json_encode 编码我的多语言字符串时,它也会更改特殊字符。我应该怎么做才能保持它们相同。

例如

<?
echo json_encode(array('şüğçö'));

它返回类似 ["\u015f\u00fc\u011f\u00e7\u00f6"]

但我想要 ["şüğçö"]

【问题讨论】:

标签: php json localization character-encoding


【解决方案1】:

试试看:

<?
echo json_encode(array('şüğçö'), JSON_UNESCAPED_UNICODE);

【讨论】:

    【解决方案2】:

    在 JSON 中,字符串中的任何字符都可以用 Unicode 转义序列表示。因此"\u015f\u00fc\u011f\u00e7\u00f6"在语义上等于"şüğçö"

    虽然这些字符也可以直接使用,但json_encode 可能更喜欢 Unicode 转义序列以避免字符编码问题。

    【讨论】:

      【解决方案3】:

      PHP 5.4 添加了选项JSON_UNESCAPED_UNICODE,它可以满足您的需求。请注意,json_encode 始终输出 UTF-8。

      【讨论】:

        【解决方案4】:
        • 你不应该想要这个
        • 这绝对是可能的,即使没有 PHP 5.4。

        首先,使用json_encode()对字符串进行编码并保存在一个变量中。

        然后只需使用preg_replace() 再次将所有 \uxxxx 替换为 unicode。

        【讨论】:

        • 等等,我刚刚回答了一个超过一年的问题吗? :-/
        【解决方案5】:

        json_encode() 不提供任何选项来选择 5.4 之前的版本中编码所在的字符集。

        【讨论】:

        • @Tom:这就是为什么你对一个在编写时准确的答案投反对票的原因吗?
        • 哈哈,我才意识到我做到了。对不起 - 投票被删除。我不知道为什么我什至查看了这个问题。
        【解决方案6】:
        <?php
        
        print_r(json_decode(json_encode(array('şüğçö'))));
        
        /*
        Array
        (   
            [0] => şüğçö
        )
        */
        

        那么您真的需要在 JSON 中保持这些字符不转义吗?

        【讨论】:

        • 是的,因为我通过 ajax 请求将它传递给 HTML,我看不到特殊字符
        • @Oguz:Ajax(例如通过 JavaScript 的异步请求)不依赖于 JSON。
        • 那么你做错了 - Ajax 肯定会很好地解释 \u00e7 字符。
        【解决方案7】:

        PHP 5.3.3

        的 Json_encode 字符集解决方案

        由于JSON_UNESCAPED_UNICODE 在 PHP 5.3.3 中不起作用,所以我们使用了这种方法并且它正在起作用。

        $data = array(
                'text' => 'Päiväkampanjat'
        );
        $json_encode = json_encode($data);
        var_dump($json_encode); // text: "P\u00e4iv\u00e4kampanjat"
        
        $unescaped_data = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
            return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
        }, $json_encode);
        
        var_dump($unescaped); // text is unescaped -> Päiväkampanjat
        

        【讨论】:

          猜你喜欢
          • 2010-10-01
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 2011-01-02
          • 2011-04-20
          • 2011-03-19
          • 2023-03-31
          相关资源
          最近更新 更多