使用Latin1 db编码处理UTF-8字符

时间:2016-01-27 22:27:57

标签: ruby-on-rails ruby postgresql encoding

我不断收到ActiveRecord::StatementInvalid: PG::UntranslatableCharacter: ERROR: character with byte sequence 0xe2 0x80 0x99 in encoding "UTF8" has no equivalent in encoding "LATIN1"的异常。我做了一些检查,它看起来像是反击或撇号。处理这个问题的最佳方法是什么?只是删除字符或将整个数据库转换为UTF-8?如果它转换为UTF-8,我怎么能永久地执行它,因为如果你在shell中执行它似乎总是会恢复?

1 个答案:

答案 0 :(得分:1)

我不明白你的意思是“恢复,如果在shell中完成”,但是:你似乎有一个应用程序,其中某些部分(至少数据库)使用编码LATIN1,以及一部分(你的Rails应用程序) )正在使用UTF-8。 IMO,最好是你拥有Unicode中的每一个,但是转换到什么程度是有意义的,一般不能说。例如,如果您的数据库也被其他工具处理,而那些期望为Latin1,那么转换是不明智的。

在任何情况下,您都需要在使用哪种编码和在此边框处理转换之间定义清晰的边界线。这不仅适用于数据库,还适用于 - 例如 - 您正在生成的HTML页面(希望是UTF-8),用户上传的文件和应用程序的进程等等。

如果您转换为某种字符无法表示的编码 - 就像您的情况一样 - 您只有三种选择:

  • 拒绝数据(它们必须是在某处生成的,可能是网络表单中的用户输入),

  • 只需删除有问题的字符

  • 即可
  • 用占位符替换有问题的字符(例如,问号)

这些选项都不是很令人满意,但是如果将数据库转换为UTF-8是不可取的,那么您应该在生成问题字符串时处理此问题,而不是在将数据写入数据库时​​处理。