hor*_*guy 3 ruby string encoding utf-8 ruby-2.0
我使用的是 Ruby 2.3:
我有以下字符串:"\xFF\xFE"
我对File.binread()包含它的文件执行了 a 操作,因此该字符串的编码是ASCII-8BIT. "\xFF\xFE"然而,在我的代码中,我通过将其与文字字符串(其默认编码UTF-8与所有 Ruby 字符串相同)进行比较来检查该字符串是否确实被读取。
然而,即使两个字符串包含相同的字节,比较也会返回false- 恰好一个是编码的ASCII-8BIT,另一个是编码的UTF-8
我有两个问题:(1)为什么它会返回false?(2) 实现我想要的目标的最佳方法是什么?我只是想检查我读取的字符串是否匹配"\xFF\xFE"
\n\n\n(1) 为什么会返回
\nfalse?
比较字符串时,它们必须采用相同的编码,或者它们的字符必须可以用 US-ASCII 进行编码。
\n\n如果字符串仅包含字节值 0 到 127,则比较按预期进行:( 0b0xxxxxxx)
a = \'E\'.encode(\'ISO8859-1\') #=> "E"\nb = \'E\'.encode(\'ISO8859-15\') #=> "E"\n\na.bytes #=> [69]\nb.bytes #=> [69]\na == b #=> true\nRun Code Online (Sandbox Code Playgroud)\n\n如果它包含任何字节值 128 到 255,则失败:( 0b1xxxxxxx)
a = \'\xc3\x89\'.encode(\'ISO8859-1\') #=> "\\xC9"\nb = \'\xc3\x89\'.encode(\'ISO8859-15\') #=> "\\xC9"\n\na.bytes #=> [201]\nb.bytes #=> [201]\na == b #=> false\nRun Code Online (Sandbox Code Playgroud)\n\n您的字符串无法以 US-ASCII 表示,因为它的两个字节都超出了其范围:
\n\n"\\xFF\\xFE".bytes #=> [255, 254]\nRun Code Online (Sandbox Code Playgroud)\n\n尝试转换它不会产生任何有意义的结果:
\n\n"\\xFF\\xFE".encode(\'US-ASCII\', \'ASCII-8BIT\', :undef => :replace)\n#=> "??"\nRun Code Online (Sandbox Code Playgroud)\n\nfalse因此,当与其他编码中的字符串进行比较时,无论其内容如何,该字符串都会返回。
\n\n\n(2) 实现我想要的目标的最佳方法是什么?
\n
您可以将您的字符串与具有相同编码的字符串进行比较。binread返回编码中的字符串ASCII-8BIT,因此您可以使用b它来创建兼容的字符串:
IO.binread(\'your_file\', 2) == "\\xFF\\xFE".b\nRun Code Online (Sandbox Code Playgroud)\n\n或者你可以比较它bytes:
IO.binread(\'your_file\', 2).bytes == [0xFF, 0xFE]\nRun Code Online (Sandbox Code Playgroud)\n