我正在开发一个应用程序,其中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的数据格式正确?
答案 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
)是否为正确的角色,没有人工健全检查。