(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