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
<meta charset="utf-8" />
【讨论】:
为什么在 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的主要内容,如果未能解决你的问题,请参考以下文章