我有一些json我需要解码,更改然后编码而不会弄乱任何字符 .
如果我在json字符串中有一个unicode字符,它将无法解码 . 我不确定为什么因为json.org说字符串可以包含: any-Unicode-character- except-"-or-\-or- control-character
. 但它在python中也不起作用 .
{"Tag":"Odómetro"}
我可以使用utf8_encode,它允许使用json_decode对字符串进行解码,但是该字符会被破坏成其他内容 . 这是结果数组的print_r的结果 . 两个字符 .
[Tag] => Odómetro
当我再次对数组进行编码时,我将字符转义为ascii,根据json规范这是正确的:
"Tag"=>"Od\u00f3metro"
有什么方法可以解除这个吗? json_encode没有给出这样的选项,utf8_encode似乎也没有用 .
Edit 我看到json_encode有一个unescaped_unicode选项 . 然而它只在php 5.4上发布了.2926743_ s . 我将不得不使用一些正则表达式,因为我只有5.3 .
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...
7 回答
从你所说的一切来看,你所处理的原始字符串似乎是用ISO 8859-1编码的,而不是UTF-8 .
这就是为什么我这么认为:
通过
utf8_encode
运行输入字符串后,json_encode
生成了可解析输出,该字符串从ISO 8859-1转换为UTF-8 .你确实说在执行
utf8_encode
之后使用print_r
时输出了"mangled",但你得到的错误输出实际上是试图解析UTF-8文本为ISO 8859-1(ó是UTF-8中的\x63\xb3
,但该序列在ISO 8859-1中是ó
.您的
htmlentities
黑客解决方案有效 .htmlentities
需要知道输入字符串的编码才能正常工作 . 如果未指定,则采用ISO 8859-1 . (html_entity_decode
,令人困惑,默认为UTF-8,因此您的方法具有从ISO 8859-1转换为UTF-8的效果 . )你说你在Python中遇到了同样的问题,这似乎排除了PHP的问题 .
PHP将使用
\uXXXX
转义,但正如您所指出的,这是有效的JSON .因此,您似乎需要配置与Postgres的连接,以便它为您提供UTF-8字符串 . PHP手册指示您通过将
options='--client_encoding=UTF8'
附加到连接字符串来执行此操作 . 当前存储在数据库中的数据也可能是错误的编码 . (您可以简单地使用utf8_encode
,但这仅支持属于ISO 8859-1的字符) .最后,正如另一个答案所指出的,你确实需要确保使用HTTP标头或其他方式声明正确的字符集(当然,这个特定的问题可能只是你进行
print_r
测试的环境的工件) .我找到了以下方法来解决这个问题...我希望这可以帮到你 .
在PHP 5.4中添加了JSON_UNESCAPED_UNICODE,因此看起来您需要升级您的PHP版本才能利用它 . 5.4虽然尚未发布! :(
如果您想在开发机器上玩游戏,那么QA上有一个5.4 alpha release candidate .
在PHP 5.3中执行JSON_UNESCAPED_UNICODE的一种hacky方式 . 对PHP json支持感到非常失望 . 也许这会帮助别人 .
尝试在页面中设置
utf-8
编码:这对我有用:
尝试使用:
你很亲密,只需使用utf8_decode .