PHP 解码和编码 json 与 unicode 字符

2022-08-30 11:18:08

我有一些json需要解码,更改,然后编码而不会弄乱任何字符。

如果我在json字符串中有一个unicode字符,它不会解码。我不知道为什么,因为 json.org 说字符串可以包含:.但它在python中也不起作用。any-Unicode-character- except-"-or-\-or- control-character

{"Tag":"Odómetro"}

我可以使用utf8_encode这将允许字符串被json_decode解码,但是字符会被破坏成其他东西。这是结果数组print_r的结果。两个字符。

[Tag] => Odómetro

当我再次对数组进行编码时,字符转义为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 ...

答案 1

我找到了以下方法来解决此问题...我希望这可以帮助你。

json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

答案 2

从您所说的一切来看,您正在处理的原始字符串似乎是用ISO 8859-1编码的,而不是UTF-8编码的。Odómetro

以下是我这么认为的原因:

  • json_encode运行输入字符串 through 后生成可解析的输出,该字符串将从 ISO 8859-1 转换为 UTF-8。utf8_encode
  • 您确实说过在完成后使用时得到了“残缺”输出,但是您获得的残缺输出实际上正是尝试将UTF-8文本解析为ISO 8859-1(ó在UTF-8中,但该序列在ISO 8859-1中。print_rutf8_encode\x63\xb3ó
  • 您的黑客解决方案奏效了。 需要知道输入字符串的编码才能正常工作。如果未指定,则假定为 ISO 8859-1。(令人困惑的是,默认为 UTF-8,因此您的方法具有从 ISO 8859-1 转换为 UTF-8 的效果。htmlentitieshtmlentitieshtml_entity_decode
  • 你说你在Python中遇到了同样的问题,这似乎排除了PHP的问题。

PHP 将使用转义,但如您所指出的,这是有效的 JSON。\uXXXX

因此,似乎您需要配置与Postgres的连接,以便它将为您提供UTF-8字符串。PHP 手册指示您将通过附加到连接字符串来执行此操作。还有一种可能性是,当前存储在数据库中的数据编码错误。(您可以简单地使用 ,但这将仅支持 ISO 8859-1 中包含的字符)。options='--client_encoding=UTF8'utf8_encode

最后,正如另一个答案所指出的,您确实需要确保使用HTTP标头或其他方式声明正确的字符集(当然,此特定问题可能只是您进行测试的环境的产物)。print_r


推荐