sidekiq app中的postgres编码错误

时间:2013-10-31 17:20:31

标签: ruby postgresql encoding sequel

我正在开发一个应用程序,其中ruby sidekiq进程调用第三方并将数据解析到数据库中。

我正在使用续集和我的电影。

我在结果中得到了一些奇怪的字符,例如:

  

“Tweets en Ingl \ xE9s y en Espa \ xF1ol”

当尝试保存到postgres时,会发生以下错误:

  

Sequel :: DatabaseError:PG :: CharacterNotInRepertoire:错误:无效   用于编码“UTF8”的字节序列:0xe9 0x73 0x20

奇怪的是字符串认为它是UTF-8,如果我检查编码名称,它说:

name.encoding.name #UTF-8

我可以做些什么来确保postgres的数据格式正确?

1 个答案:

答案 0 :(得分:6)

仅仅因为字符串声称是UTF-8并不意味着它是UTF-8。 ISO-8859-1中的\xe9 é(AKA Latin-1),但在UTF-8中无效;类似地,\xf1在ISO-8859-1中是ñ但在UTF-8中无效。这表明字符串实际上是用ISO-8859-1而不是UTF-8编码的。您可以使用force_encoding的组合修复它,以纠正Ruby对当前编码的混淆,并encode将其重新编码为UTF-8:

> "Tweets en Ingl\xE9s y en Espa\xF1ol".force_encoding('iso-8859-1').encode('utf-8')
=> "Tweets en Inglés y en Español" 

因此,在将该字符串发送到您想要的数据库之前:

name = name.force_encoding('iso-8859-1').encode('utf-8')

不幸的是,没有办法可靠地检测字符串的实际编码。各种编码重叠,无法判断ISO {8859-1中的è\xe8)或ISO-8859-2中的č\xe8)是否为正确的角色,没有人工健全检查。