从您所说的一切来看,
Odómetro您要处理的原始字符串似乎是使用ISO 8859-1(而不是UTF-8)编码的。
这就是我这么认为的原因:
json_enpre
通过运行输入字符串后产生了可分析的输出,该字符串utf8_enpre
从ISO 8859-1转换为UTF-8。- 您确实说过,使用
print_r
完后使用时会得到“混乱的”输出utf8_enpre
,但是实际上得到的输出经过拼凑的正是通过尝试将UTF-8文本解析为ISO 8859-1会发生的情况(óx63xb3
在UTF-8中,但是序列ó
符合ISO 8859-1。 - 您的
htmlentities
骇客解决方案有效。htmlentities
需要知道输入字符串的编码是什么才能正常工作。如果未指定,则假定为ISO 8859-1。(html_entity_depre
,令人困惑的是,默认值为UTF-8,因此您的方法具有将ISO 8859-1转换为UTF-8的效果。) - 您说过您在Python中有同样的问题,这似乎使PHP成为问题。
PHP将使用
uXXXX转义,但是正如您所指出的,这是有效的JSON。
因此,似乎您需要配置与Postgres的连接,以便为您提供UTF-8字符串。PHP手册指示您可以通过将其附加
options='--client_encoding=UTF8'到连接字符串来完成此操作。当前存储在数据库中的数据也可能使用错误的编码。(您可以简单地使用
utf8_enpre,但这仅支持ISO
8859-1的字符)。
最后,作为另一个答案,您需要确保使用HTTP标头或其他方式声明正确的字符集(当然,此特定问题可能只是您
print_r进行测试的环境的产物) 。



