sidekiq app中的postgres编码错误

问题描述 投票:3回答:1

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

我正在使用续集和我的朋友。

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

“英文\ xE9s和Espa \ xF1ol中的推文”

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

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

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

name.encoding.name #UTF-8

我该怎么做才能确保postgres的数据格式正确?

ruby postgresql encoding sequel
1个回答
7
投票

仅仅因为字符串声称是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)是否是正确的字符,没有手动的健全性检查。

© www.soinside.com 2019 - 2024. All rights reserved.