1

我有一些数据已导入 Postgres,用于 Rails 应用程序。然而不知何故,外国口音变得奇怪了:

  • ä显示为â§
  • á显示为â°
  • é显示为â©
  • ó显示为ââ¥

我很确定问题出在数据的完整性上,而不是 Rails 的任何问题。它似乎与我尝试的任何编码都不匹配:

# Replace "cp1252" with any other encoding, to no effect
"Trollâ§ttan".encode("cp1252").force_encoding("UTF-8") #-> junk

如果有人能够确定我正在遭受哪种编码混淆,那就太好了。

作为最后的手段,我可​​能不得不手动替换每个损坏的重音字符,但如果有人可以建议一个编程解决方案(或者甚至是解决这个问题的起点——我发现它很难调试),我会五、感激。

4

1 回答 1

2

使用最新版本的 PostgreSQL 几乎不可能在 UTF8 数据库中包含无效的 UTF8。不过,还有其他可能导致该输出的合理可能性。

é显示为的典型情况下©,要么:

  1. 数据库的内容是有效的,但是某些客户端层将数据库中的字节解释为好像它们是 iso-latin-something 而它们是 UTF8。

  2. 内容有效且 SQL 客户端层有效,但您正在查看的终端/软件/网页配置为 iso-latin1 或类似的单字节编码(win1252、iso-latin9.. .)。

  3. 数据库的内容由具有有效 UTF8 编码的错误字符组成。如果您采用 iso-latin-something 字节,将它们转换为 UTF8 表示,然后将生成的字节流视为仍在 iso-latin 中,然后再次将其重新转换为 UTF8,然后插入进入数据库。

请注意,虽然该©序列在 UTF8 与 iso-latin 混淆中是典型的,但在所有示例字符串中出现附加â字符的情况并不常见。这可能是在主要误解之上的另一种误解的结果。如果您是第 3 种情况,这可能意味着基于搜索替换的自动修复将比已经很棘手的正常情况更难。

于 2012-09-10T17:52:24.590 回答