【问题标题】:How to json_encode array with french accents?如何使用法语口音对数组进行 json_encode?
【发布时间】:2011-10-19 05:30:16
【问题描述】:

我有一个带有法国口音的数组项([WIPDescription] => Recette Soupe à lOignon Sans Boeuf US)。数据正在从数据库(mysql)中正确提取。

但是,当我尝试使用 json_encode 内置的 php 将其编码为 json 时,它会产生一个空 json 值(OS X 服务器:php 5.3.4,启用 json 1.2.1)。

在 Linux 服务器中,描述在第一个重音字符之后被截断。

我尝试了所有 json_encode 选项,但没有成功。有什么建议吗?

谢谢。

【问题讨论】:

    标签: php mysql character-encoding json


    【解决方案1】:

    如果您处理变音符号,您还可以添加 JSON_PARTIAL_OUTPUT_ON_ERROR,它只会删除问题并保持其余部分不变。在我发现这个之前我使用了 utf_encode ,但它弄乱了变音符号。

    echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR);
    

    【讨论】:

      【解决方案2】:
      $json = utf8_encode($string);
      
      $json = json_decode($json);
      

      【讨论】:

        【解决方案3】:

        json_encode 只想要utf-8。根据您的字符集,您可以使用 iconvutf8_encode before 在您的变量上调用 json_encode。可能是array_walk_recursive

        根据要求,一种更改数组的未完成方法,假设 (1) 它不包含对象,并且 (2) 数组键在 ascii / 下限中,所以可以保持原样:

        $current_charset = 'ISO-8859-15';//or what it is now
        array_walk_recursive($array,function(&$value) use ($current_charset){
             $value = iconv('UTF-8//TRANSLIT',$current_charset,$value);
        
        });
        

        【讨论】:

        • array_walk_recursive 需要用户定义的函数。你会建议他制作一个在每个值上都调用 utf8_encode 的方法吗?如果是这样,这将如何影响实际的数组值——它们会被返回还是通过引用传递?这听起来是个好主意,但我无法将它放在我的脑海中。
        • @Matt Anderson:好的,就这一次......我将编辑一个不适用于对象但适用于数组的示例,并假设键是 ascii (=valid在 ascii/ISO-8859-*/utf-8)。
        • 数据库排序规则和字符集设置为utf8_unicode_ci。如何确定mysql返回数组的字符集?
        • 谢谢。当我使用 mysql_query("SET NAMES 'utf8'", $Connection);它工作正常。 (我确实意识到我必须使用 mysql_set_character_set() 函数才能正确执行此操作。)
        • @Natkeeran:确实,也可以,而且我总是使用查询变体(尤其是在 PDO 中),我看不出为什么mysql_set_charset 会更好。当然,手册确实说明了这一点,但我还没有找到原因。
        【解决方案4】:

        我发现这是处理它的最简单方法

        echo json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        

        JSON_PRETTY_PRINT - 可读
        JSON_UNESCAPED_UNICODE - 正确编码字符
        JSON_UNESCAPED_SLASHES - 去掉转义斜线 '\'
        另请注意,这些选项由管道'|'分隔

        【讨论】:

        • 正是我需要的!
        • JSON_UNESCAPED_UNICODE 是从数据库中检索 utf-8 字符串时使用的选项;它解决了我在尝试编码时只用“?”替换特殊字符时的问题。
        • 你是我的英雄! :D
        【解决方案5】:

        另一种解决方案是在使用json_encode 传递编码字符之前使用htmlentitiesutf8_encode

        像这样:

           $array = array('myvalue' => utf8_encode('ééàà'));
           return json_encode($array);
        

        或者使用htmlentities

           $array = array('myvalue' => htmlentities('ééàà'));
           return json_encode($array);
        

        【讨论】:

        • 而在浏览器中如何解码回utf8?
        • @Inanikian 使用 PHP header('Content-Type: text/html; charset=utf-8'); 和 HTML <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        • 我试过header('Content-Type:application/json; charset=utf-8')但仍然有代码u/...所以我决定删除法语单词à...
        • 这解决了我的 json_encoding 字符串问题。谢谢!
        【解决方案6】:
        <? 
        
        $sql=mysql_query("SELECT * FROM TABLE...");
        
        while($row=mysql_fetch_array($sql))
        {
            $output[]=array_map("utf8_encode", $row);
        }
        print(json_encode($output));
        mysql_close();
        
        ?>
        

        【讨论】:

          【解决方案7】:

          根据PHP docs

          此函数仅适用于 UTF-8 编码的数据。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-25
            • 2017-01-07
            • 2011-09-18
            • 1970-01-01
            • 1970-01-01
            • 2018-09-20
            • 1970-01-01
            相关资源
            最近更新 更多