我有一些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。

这就是我这么认为的原因:

    在通过json_encode运行输入字符串后,
  • 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标头或其他方式声明正确的字符集(当然,此特定问题可能只是您所做的环境的产物。您的基因识别代码测试)。

其他提示

我找到了解决此问题的以下方法...希望对您有所帮助。 通用标签

在PHP 5.4中添加了

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: 通用标签

编码应在此之后工作: 通用标签

将UTF-8转换为ISO 8859-1,或者将其转换为ISO 8859-1

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top