我在Ruby脚本中遇到字符编码问题,该脚本使用Nokogiri gem进行了一些HTML抓取和解析。在脚本的某一时刻,我调用join("\n")
了从某些HTML中提取的字符串数组,这会导致此错误:
./script.rb:333:in `join': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
在我的日志中,可以看到Café
出现了一些包含在联接操作中的字符串。
是我数组中要连接的某些字符串是ASCII-8BIT,有些是UTF-8,而ruby无法将它们组合在一起吗?使用Nokogiri(转换为UTF-8)解析字符串后,是否需要转换或清理字符串?
在尝试对HTML内容进行任何其他操作之前,我尝试force_encoding('UTF-8')
并encode('UTF-8')
对其进行了处理,但这无济于事。实际上,在尝试之后encode('UTF-8')
,脚本调用to_s
包含的字符串时甚至更早崩溃了Café
。
字符编码总是让我感到困惑。我还有其他方法可以清理字符串以避免此错误吗?
编辑:
最近我在Perl中做过类似的事情,并使用了一个名为的模块,Text::Unidecode
并且能够将我的字符串传递给一个函数,该函数可以转换任何有问题的字符,例如a
,将尖锐字母转换为普通字母a
。红宝石有什么类似的东西吗?(尽管这不一定是我想要的目标,但是如果我可以使a保持敏锐,那我认为是可取的。
Edit2:
我对此感到非常困惑,事实证明很难可靠地复制它。这是一些代码:
[CODE REMOVED]
Edit3:
我删除了以前发布的代码示例,因为它不正确。但最重要的是,每当我尝试打印或调用to_s
被抓取的字符串时,都会遇到编码错误。
Edit4:
最终发现,抓取的html输入不是引起问题的原因。每当我尝试在包含(尤其是)抓取的html文本的哈希值上打印或调用to_s时,都会遇到编码错误。“其他内容”是来自数据库查询的值,它们在中返回ASCII-8BIT
。为了解决这个问题,我明确地必须调用force_encoding('UTF-8')
我使用的每个数据库值(尽管我听说mysql2
gem会自动执行此操作,所以我应该切换到该值)。
我讨厌字符编码。
大概Café
应该是Café
。如果我们从Café
UTF-8开始,但是将字节当作是在ISO-8859-1(AKA Latin-1)中进行编码,然后将它们重新编码为UTF-8,我们将得到Café
您所看到的。例如:
> s = 'Café'
=> "Café"
> s.encoding
=> #<Encoding:UTF-8>
> s.force_encoding('iso-8859-1').encode('utf-8')
=> "Café"
因此,在某处您正在读取UTF-8字符串,但将其视为Latin-1并将其重新编码为UTF-8。我猜想Nokogiri正在阅读该页面并认为它是Latin-1,或者被您的用户代理告知它正在获取Latin-1文本。也许您的某个地方的默认编码不正确,或者HTTP标头与编码有关,或者页面本身与编码有关。
您需要将所有内容放入刮板边缘的UTF-8中。找出谁在撒谎,然后在那儿整理出来。
别难过,抓取和编码是混乱,愚蠢、,测和烈酒的噩梦。服务器的谎言,页面的谎言,浏览器的谎言,没有人感到高兴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句