我目前正在尝试编写一个迭代输入文件并检查网站数据的脚本。 如果找到新数据,它会打印到它传递的终端,如果没有,则告诉我它失败了。 对于删除的数据,反之亦然。 它一直工作正常,直到我给出的输入文件包含“™”字符。 然后当ruby到达那一行时,它会吐出一个错误:

PDAPWeb.rb:73:在`include?'中:不兼容的字符编码:UTF-8和IBM437(Encoding :: CompatibilityError)

违规行是一个简单的检查,以查看页面上是否存在文本。

if browser.text.include? (program_name)

其中program_name变量是来自输入文件的已解析信息。 在这种情况下,program_name包含前面提到的'TM'字符。

经过一些研究后,我发现在我的脚本开头添加#encoding:utf-8行可能有所帮助,但到目前为止还没有证明有用。

我将它添加到我的program_name变量中以查看它是否有用(并且它允许我的脚本无错误地运行),但现在它没有正确地找到它应该的TM字符。

program_name = record[2].gsub("\n", '').force_encoding("utf-8").encode("IBM437", replace: nil)

这似乎将TM字符转换为:Γäó

我想也许我有IBM437和utf-8部件相反,所以我尝试了相反的

program_name = record[2].gsub("\n", '').force_encoding("IBM437").encode("utf-8", replace: nil)

并且我现在在尝试运行脚本时收到此错误

PDAPWeb.rb:48:在`encode'中:从UTF-8到IBM437的U + 2122(Encoding :: UndefinedConve rsionError)

我使用的是ruby 1.9.3p392(2013-02-22),我不确定是否应该升级,因为这是我公司安装的标准版本。

我的编码是否不正确并导致它转换TM字符有错误?

===============>>#1 票数:8 已采纳

这就是它的样子。 您的输入文件包含一个字符,它采用UTF-8编码。 但是当你阅读它时,由于你没有指定编码,Ruby假定它是你系统的默认编码IBM437(你必须在Windows上)。

这与此基本相同:

>> input = "™"
=> "™"
>> input.encoding
=> #<Encoding:UTF-8>
>> input.force_encoding 'ibm437'
=> "\xE2\x84\xA2"

请注意, force_encoding不会更改实际字符串,只会更改与其关联的标签。 这与您的情况相同,只有您通过不同的路线到达此处(通过阅读文件)。

该网页也有一个符号,也编码为UTF-8,但在这种情况下,Ruby的编码是正确的(Watir可能使用页面中的标题):

>> web_page = '™'
=> "™"
>> web_page.encoding
=> #<Encoding:UTF-8>

现在,当您尝试比较这两个字符串时,会出现兼容性错误,因为它们具有不同的编码:

>> web_page.include? input
Encoding::CompatibilityError: incompatible character encodings: UTF-8 and IBM437
    from (irb):11:in `include?'
    from (irb):11
    from /Users/matt/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'

如果两个字符串中的任何一个只包含ASCII字符(即代码点少于128),那么这种比较就可以了。 UTF-8和IBM437都是ASCII的超集,如果它们都包含ASCII范围之外的字符,则它们只是不兼容。 这就是您在输入文件具有时才开始看到此行为的原因。

修复是告知Ruby输入文件的实际编码是什么。 您可以使用已加载的字符串执行此操作:

>> input.force_encoding 'utf-8'
=> "™"

您也可以在读取文件时执行此操作 ,例如(有几种方法可以读取文件,它们都应该允许您明确指定编码):

input = File.read("input_file.txt", :encoding => "utf-8")
# now input will be in the correct encoding

注意,在这两个字符串中都没有被更改,它仍然包含相同的字节,但Ruby现在知道它的正确编码。

现在比较应该可行:

>> web_page.include? input
=> true

无需encode字符串进行encode 如果你这样做会发生什么。 首先,如果您将编码更正为UTF-8,则编码为IBM437:

>> input.force_encoding("utf-8").encode("IBM437", replace: nil)
Encoding::UndefinedConversionError: U+2122 from UTF-8 to IBM437
    from (irb):16:in `encode'
    from (irb):16
    from /Users/matt/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'

IBM437不包含字符,因此您不能将包含它的字符串编码为此编码而不会丢失数据。 默认情况下,Ruby会在发生这种情况时引发异常。 您可以使用:undef选项强制编码,但符号丢失:

>> input.force_encoding("utf-8").encode("IBM437", :undef => :replace)
=> "?"

如果你走另一条路,首先使用force_encoding到IBM437,然后编码为UTF-8,你得到字符串Γäó

>> input.force_encoding("IBM437").encode("utf-8", replace: nil)
=> "Γäó"

就Ruby而言,该字符串已经采用IBM437编码,因此force_encoding不会执行任何操作。 的UTF-8表示是三个字节0xe2 0x84 0xa2 ,当解释为IBM437这些字节对应于这里看到的三个字符然后被转化为它们的UTF-8表示。

(这两个结果与您在问题中描述的内容相反,因此我的评论如上所述。我假设这只是一个复制粘贴错误。)

  ask by Todd J. translate from so

未解决问题?本站智能推荐:

2回复

访问Ruby对象中的字符串

我有一个使用.inspect的Ruby对象@element 。 结果如下 如何访问"foo" 我试过@element.id (代替它查找红宝石对象ID), @element.selector[:id] @element[:id]和@element.selector[:id] ,
1回复

Ruby / Regex:使用gsub和regex处理包含正斜杠和括号的字符串

嗨,我正在使用Watir单击某些链接。 我转到一个页面,单击基于其文本的链接,然后再次单击一个新链接。 我要根据他们的文本查找链接(这是我可以基于其HTML的唯一方法),并且需要匹配从页面中提取的文本到链接。 我得到的文本包含一些多余的文本,而不是链接的一部分,因此我需要将其gsub出去。
2回复

Ruby / Watir - 位于= false

为什么所有元素都是假的? 我是说因为有很多次非找到的元素,给出错误。 以Etsy为例:
1回复

ubuntu上的ruby的红宝石无法连接

我收到以下错误: 我正在尝试在Ubuntu盒子上使用watir,ruby gem运行Rspec。 但是我在Firefox 42上一直收到此错误。 我不确定要解决此网络问题需要做什么。 阅读以下内容,但我使用的是Firefox的更高版本: 无法在60秒内获得稳定的f
3回复

Ruby:杀死Chrome进程

我正在使用WATIR来控制浏览器,但是有一个页面永远不会完全加载所有卡住的内容。 60秒后超时WATIR给我错误,我可以继续编写命令,但是如果我尝试用WATIR关闭浏览器,那么所有功能都会卡住。 如果我手动关闭浏览器,一切似乎都保持正常,所以我正在寻找选项来查找chrome进程ID,PI
4回复

Ruby Watir获取页面的特定html元素

我已经尝试过这个了: 而且有效。 我想问问是否有可能仅显示或打印特定元素或html标签。 例如这个: 有什么方法只能获取此元素吗? 不是整个页面源。 我也尝试 错误是:
3回复

如何使用Ruby(Watir / WebDriver)捕获GET调用?

在我正在测试的网页上,当用户单击选择列表中的选项时,将进行GET调用。 GET看起来像这样: 如何告诉Ruby侦听GET请求并将其捕获,或更具体地说,将上面GET中请求的URL捕获并放入变量中。 ( 我使用的是watir-webdriver gem,我希望里面有东西能让我做到这一
1回复

由于Watir错误,无法在Ruby中自动化(AutoIT)

我已经尝试过几次运行Watir浏览器,然后使用AutoIt ruby​​库(au3)来访问右键单击上下文菜单,但是它不起作用,结果是au3库由于某种原因而消失了(我Ruby有点新,但是当浏览器打开后再次需要它时,由于某种原因它会返回false : 我猜想SANDBOXED对运行au3至关
2回复

是否可以使用Ruby或Watir自动安装?

目前,我们每天都在安装setup.exe文件以进行测试。我想使用Ruby或Watir自动化安装,是否可以自动化? 请帮助我如何执行并提出您的建议。
2回复

如何使用Ruby处理IE中弹出的窗口

请帮助我如何处理此弹出窗口。