【问题标题】:json_encode() excluding UTF-8 encoded string from outputjson_encode() 从输出中排除 UTF-8 编码的字符串
【发布时间】:2012-09-19 16:08:34
【问题描述】:

我正在使用 CakePHP 输出一个包含多个 UTF-8 编码字符串的数组。我为输出设置了布局(这是一种 REST API 方法):

<?php.
  header("Pragma: no-cache");.
  header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");.
  header('Content-Type: application/json; charset=UTF-8');.
  header("X-JSON: ".$content_for_layout);.
  echo $content_for_layout;.
?>

这是我的看法:

<?php echo json_encode($items); ?> 

我获取数据的数据库表以 utf-8 编码。但是,当我输出数据时,如果其中一个元素具有 à、á 等特殊字符,则该字符串将在 JSON 数组中设置为 null。如何正确输出我的数据?

【问题讨论】:

    标签: php json cakephp utf-8


    【解决方案1】:

    您的数据库连接似乎没有设置为 utf-8,这是最重要的部分。所以将'encoding' =&gt; 'utf8'添加到你app/config/database.php中的数据库配置中,例如:

        'default' => array(
            'driver'   => 'mysql',
            'host'     => 'YOURHOST',
            'login'    => 'YOURLOGIN',
            'password' => 'YOURPASS',
            'database' => 'YOURDB',
            'encoding' => 'utf8'
        ),
    

    如果您未在连接中设置编码,将使用“默认”编码。默认可能不是 utf8。

    【讨论】:

    • 让我检查一下,虽然有问题,有些表设置为latin1,有些设置为utf8,这不会产生一些不一致吗? (不要评判我:(我没有设置数据库或网站)
    • 刚查了一下,编码设置为utf-8,和utf8有什么区别?
    • @8vius MySQL 将其称为“utf8”,而不是“utf-8”。到目前为止,该应用程序一直在与损坏的编码设置一起巡航......
    • 不会有任何不一致; MySQL 将返回连接编码中的所有文本。 latin1 文本也将以 UTF-8 格式返回。如果这导致显示错误,请检查您是否已在 config/core.php 中将 App.encoding 设置为 utf-8。
    • 设置好了,我收到了显示错误,就像 @deceze 的回答中提到的 cmets 一样。
    【解决方案2】:

    这很可能意味着您的数据没有以 UTF-8 编码,很可能是因为数据库 connection 未设置为 UTF-8 而您实际上正在接收PHP端的latin1中的数据。请参阅Handling Unicode Front To Back In A Web App 了解所有问题的概要。

    【讨论】:

    • 我的数据库表设置为 utf8_general_ci,如何正确设置 CakePHP?虽然我真的不应该因为我可能会破坏整个网站(我没有开发它,我只是添加了一个 API 方法)
    • @Joni 刚刚提供了答案。如果您无法更改该默认值(实际上,如果到目前为止没有正确的连接设置就使用了它,如果您更改它,您的数据将会彻底搞砸),您必须手动转换字符串的编码,如其他答案。为什么这对你不起作用我不知道。向我们展示其中一个字符串的bin2hex($string),这样我们就可以看到它们的编码方式。
    • 刚刚做了@Joni 所说的更改,现在我得到了带有 \u00f3 等字符编码的字符串,并且在视图中它已损坏并显示类似 ó 的内容
    • @8vius 是的,因为数据库中的数据已经是垃圾了。为什么在我的链接文章中详细解释... :)
    • 在数据库中,如果我在 phpMyAdmin 中查看它,它会正确显示特殊字符和所有字符。
    【解决方案3】:
    $items = json_encode( array_map( function($text){ return is_string($text) ? utf8_encode($text) : $text; }, $items) )
    echo $items;
    

    【讨论】:

    • 同样的错误,数据库中的数据已经是utf-8编码了。
    猜你喜欢
    • 2011-09-30
    • 2011-02-16
    • 1970-01-01
    • 2014-06-09
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多