PHP json_encode json_decode UTF-8

Posted

技术标签:

【中文标题】PHP 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(),我刚刚看到了(编辑:啊,你更快) 【参考方案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】:
    utf8_decode$j_decoded = utf8_decode(json_decode($j_encoded));编辑 或者更正确$j_encoded = json_encode($j_encoded);$j_decoded = json_decode($j_encoded);不需要编码/解码utf8 &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);

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

【讨论】:

以上是关于PHP json_encode json_decode UTF-8的主要内容,如果未能解决你的问题,请参考以下文章

PHP json_encode( ) 函数介绍

PHP“漂亮打印”json_encode [重复]

php中自带函数 json_encode

php json_encode 返回false

PHP的json_encode处理中文

PHP json_encode()函数兼容PHP 4