我有一些数据已导入Postgres,用于Rails应用程序。然而不知何故,外国口音变得异常编码:
ä
显示为â§
á
显示为â°
é
显示为â©
ó
显示为ââ¥
我很确定问题在于数据的完整性,而不是Rails的任何问题。它似乎与我尝试的任何编码都不匹配:
# Replace "cp1252" with any other encoding, to no effect
"Trollâ§ttan".encode("cp1252").force_encoding("UTF-8") #-> junk
如果有人能够确定我正在遭受什么样的编码混合,那就太棒了。
作为最后的手段,我可能必须手动替换每个损坏的重音字符,但如果有人可以建议一个程序化的解决方案(或者甚至是解决这个问题的起点 - 我发现它很难调试),我“感激不尽。”
答案 0 :(得分:2)
最近版本的PostgreSQL几乎不可能在UTF8数据库中包含无效的UTF8。但是,还有其他合理的可能性可能导致产出。
在é
显示为©
的典型情况下,要么:
数据库的内容是有效的,但是某些客户端层正在从数据库中解释字节,就好像它们是iso-latin-something而它们是UTF8。
内容有效且SQL客户端层有效,但您正在查看的终端/软件/网页配置为iso-latin1或类似的单字节编码(win1252) ,iso-latin9 ...)。
数据库的内容由具有有效UTF8编码的错误字符组成。如果您使用iso-latin-something字节,将它们转换为UTF8表示形式,然后将生成的字节流视为仍然使用iso-latin,并将其再次重新转换为UTF8,并插入进入数据库。
请注意,尽管©
序列在UTF8与iso-latin混淆中是典型的,但在所有示例字符串中存在额外的â
并不常见。这可能是在主要问题之上进行另一次误解的结果。如果您遇到#3,这可能意味着基于搜索替换的自动修复将比已经很棘手的正常情况更难。