【问题标题】:PHP json_encode json_decode UTF-8PHP json_encode json_decode UTF-8
【发布时间】:2011-05-03 21:10:47
【问题描述】:

如何将带有国际字符的 json 编码字符串保存到数据库中,然后在浏览器中解析解码后的字符串?

<?php           
    $string = "très agréable";  
    // to the database 
    $j_encoded = json_encode(utf8_encode($string)); 
    // get from Database 
    $j_decoded = json_decode($j_encoded); 
?>    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <?= $j_decoded ?>
</html> 

【问题讨论】:

  • 和你展示的差不多。什么不起作用?
  • 它给了我:très agréable
  • 尝试将页面的字符集设置为 UTF-8... 在
  • @Mark,这有效,但仅在使用 $j_encoded = json_encode($string);所以没有 utf8_encode()
  • @FFish 去掉你代码中的utf8_encode(),我刚刚看到了(编辑:啊,你更快)

标签: php utf-8 json


【解决方案1】:

json utf8 编码和解码:

json_encode($data, JSON_UNESCAPED_UNICODE)

json_decode($json, false, 512, JSON_UNESCAPED_UNICODE)

force utf8 也可能有帮助:http://pastebin.com/2XKqYU49

【讨论】:

  • 为什么要减去?我有足够的情况,这是唯一可行的方法。不要告诉我有关文件、数据库等编码的所有内容。在某些情况下,您不知道资源的编码并且它是随机出现的。一些 utf8 一些你能想象到的任何其他的。
  • 唯一对我有用的东西,我正在构建一个 API,我需要将响应纯粹打印为带有编码字符的 json
  • 感谢 Lukas,这正是我想要的。它将\u00e9 等编码转换为é。我刚刚在PHP docs (example 2) 中确认了它的用法。不过我还是很好奇,depth 参数真的有用吗?如果递归停止在某个深度,是否意味着json不会根据位掩码完全编码/解码?
  • 另见this answer,使用JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES
【解决方案2】:

这是一个编码问题。看起来在某些时候,数据被表示为 ISO-8859-1。

流程的每个部分都需要进行 UTF-8 编码。

  • 数据库连接

  • 数据库表

  • 您的 PHP 文件(如果您在该文件中使用特殊字符,如上例所示)

  • 您输出的content-type 标头

【讨论】:

  • 我认为这是最好的答案,我需要检查我的数据库编码!
  • 您可以添加完成所有这些操作所需的代码。
【解决方案3】:
  header('Content-Type: application/json; charset=utf-8');

【讨论】:

    【解决方案4】:

    如果您的源文件已经是 utf8,则删除 utf8_* 函数。 php5 将字符串存储为字节数组。

    您应该在 html 中添加一个用于编码的元标记,并且您应该添加一个 http 标头,将传输编码设置为 utf-8。

    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    

    在php中

    <?php
    header('Content-Type: text/html; charset=utf-8');
    

    【讨论】:

      【解决方案5】:

      尝试发送 UTF-8 字符集标头:

      <?php header ('Content-type: text/html; charset=utf-8'); ?>
      

      还有 HTML 元数据:

      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      

      【讨论】:

        【解决方案6】:
        1. utf8_decode$j_decoded = utf8_decode(json_decode($j_encoded));编辑 或者更正确$j_encoded = json_encode($j_encoded);$j_decoded = json_decode($j_encoded);不需要编码/解码utf8
        2. &lt;meta charset="utf-8" /&gt;

        【讨论】:

        • 为什么在 UTF-8 环境中需要utf8_decode()(转换为 ISO-8859-1)?
        • 好的,我明白了。我也必须 utf8_decode() .. utf8_decode(json_decode($j_encoded)) 与 json_decode(utf8_decode($j_encoded)) 有区别吗?
        • 是的,而且是正确的,无论如何你都不应该使用utf8_encode。但你使用它的方式是关键。 1 你编码 utf8 然后 json 所以要得到你的输入你必须解码 json 然后 utf8
        • @Pekka 如果你还是搞砸了编码(参见utf8_encode),你必须纠正它。好的,不要弄乱编码也是一种解决方案,我已经编辑了我的答案以反映这一点
        【解决方案7】:

        对我来说两种方法

        <?php
        
        header('Content-Type: text/html; charset=utf-8');
        
        echo json_encode($YourData, \JSON_UNESCAPED_UNICODE);
        

        【讨论】:

          【解决方案8】:

          如果您收到“意外字符”错误,您应该检查是否有 BOM(字节顺序标记保存到您的 utf-8 json. 如果没有 BOM,您可以删除第一个字符或保存。

          【讨论】:

            【解决方案9】:

            为我工作:)

            function jsonEncodeArray( $array ){
                array_walk_recursive( $array, function(&$item) { 
                   $item = utf8_encode( $item ); 
                });
                return json_encode( $array );
            }
            

            【讨论】:

            • 谢谢,这为我指明了方向,但起初它让事情变得更糟! :) 然后我意识到这是因为某些东西显然在堆栈更深处的某个地方被“过度编码”,所以 - 也许奇怪 - 将 utf8_encode 更改为 utf8_decode 解决了它。
            【解决方案10】:

            我遇到了同样的问题。它可能会有所不同,具体取决于您将数据放入数据库的方式,但请尝试对我有用的方法:

            $str = json_encode($data);
            $str = addslashes($str);
            

            在将数据保存到数据库之前执行此操作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-14
              • 2014-12-18
              相关资源
              最近更新 更多