我正在开发一个应用程序,其中ruby sidekiq进程调用第三方并将数据解析到数据库中。
我正在使用续集和我的朋友。
我在结果中得到了一些奇怪的字符,例如:
“英文\ xE9s和Espa \ xF1ol中的推文”
当尝试保存到postgres时,会发生以下错误:
Sequel :: DatabaseError:PG :: CharacterNotInRepertoire:ERROR:编码“UTF8”的无效字节序列:0xe9 0x73 0x20
奇怪的是,字符串认为它是UTF-8,如果我检查编码名称,它说:
name.encoding.name #UTF-8
我该怎么做才能确保postgres的数据格式正确?
仅仅因为字符串声称是UTF-8并不意味着它是UTF-8。 \xe9
是é
(AKA Latin-1)中的ISO-8859-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
)是否是正确的字符,没有手动的健全性检查。