(1)为什么它返回false
?
比较字符串时,它们必须是相同的编码,或者它们的字符必须在US-ASCII中可编码。
比较将按预期如果字符串仅包含字节值0至127:(0b0xxxxxxx
)
a = 'E'.encode('ISO8859-1') #=> "E"
b = 'E'.encode('ISO8859-15') #=> "E"
a.bytes #=> [69]
b.bytes #=> [69]
a == b #=> true
而如果它包含任何字节值失败128至255:(0b1xxxxxxx
)
a = 'É'.encode('ISO8859-1') #=> "\xC9"
b = 'É'.encode('ISO8859-15') #=> "\xC9"
a.bytes #=> [201]
b.bytes #=> [201]
a == b #=> false
您的字符串不能用US-ASCII表示,因为它的字节在其范围之外:
"\xFF\xFE".bytes #=> [255, 254]
试图转换它不产生任何有意义的结果:
"\xFF\xFE".encode('US-ASCII', 'ASCII-8BIT', :undef => :replace)
#=> "??"
字符串因此将返回false
被比较,以另一种编码的字符串时,无论其内容。
(2)什么是最好的方式去实现我想要的?
您可以将您的字符串与具有相同编码的字符串进行比较。 binread
返回一个字符串在ASCII-8BIT
编码,因此您可以使用b
来创建一个兼容的一个:
IO.binread('your_file', 2) == "\xFF\xFE".b
,或者你可以比较其bytes
:
IO.binread('your_file', 2).bytes == [0xFF, 0xFE]
如果你只是想读取一个Unicode文件BOM,您可以传递BOM的UTF-8的[encoding](http://ruby-doc.org/core-2.4.2/IO.html#method-c-new-label-IO+Encoding) “让Ruby自动处理它。 – Stefan