PHP用Unicode字符解码和编码json
-
29-10-2019 - |
题
我有一些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
.
当我再次对数组进行编码时,I字符逃离到ASCII,根据JSON规范,这是正确的:
"Tag"=>"Od\u00f3metro"
.
有些方法我可以取消逃避这个吗? json_encode不提供此选项,UTF8_Encode似乎也不工作。
编辑我看到json_encode有一个Unescaped_unicode选项。但它不按预期工作。哦,该死的,它只在PHP 5.4上。我将不得不使用一些正则表达式,因为我只有5.3。
.$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...
解决方案
从您所说的所有内容来看,您要处理的原始Odómetro
字符串似乎是使用ISO 8859-1编码的,而不是UTF-8。
这就是我这么认为的原因:
-
在通过
-
utf8_encode
产生了可解析的输出,该代码从ISO 8859-1转换为UTF-8。 - 您确实说过,在执行了
print_r
之后使用utf8_encode
时,您得到了“混乱”的输出,但实际上,通过将UTF-8文本解析为ISO 8859-1会得到正确的输出(ó是\x63\xb3
,在UTF-8,但是该序列是ISO 8859-1中的ó
。 - 您的
htmlentities
hackaround解决方案有效。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标头或其他方式声明正确的字符集(当然,此特定问题可能只是您所做的环境的产物。您的基因识别代码测试)。
json_encode
运行输入字符串后,其他提示
我找到了解决此问题的以下方法...希望对您有所帮助。 通用标签
JSON_UNESCAPED_UNICODE
,因此您似乎需要升级PHP版本才能利用它。5.4尚未发布!:(
如果您想在自己的开发机上玩游戏,则质量检查中有一个 5.4 alpha版本候选。/ p>
一种在PHP 5.3中执行JSON_UNESCAPED_UNICODE的简单方法。真的对PHP json支持感到失望。也许这会帮助别人。 通用标签
尝试在您的页面中设置utf-8
编码:
通用标签
这对我有用: 通用标签
您已经接近,只需使用utf8_decode。
尝试使用: 通用标签
要对包含特殊字符(ISO 8859-1至UTF8)的数组进行编码。(如果utf8_encode和utf8_decode不适用于您,则可以选择)
ISO-8859-1中的所有内容都应转换为UTF8: 通用标签
编码应在此之后工作: 通用标签