Ruby 为什么非ASCII字符不相等?

Ruby 为什么非ASCII字符不相等?,ruby,byte,Ruby,Byte,我有两个测试用例,其中调用了data\u valid?方法。第一个返回false,第二个返回true,为什么 55: def data_valid? d 56: crc = d[-1] 57: data = d[1..-2] 58: len = d[0] => 59: binding.pry 60: (data ^ len) == crc 61: end 2.0.0 (#<MicroAeth::Message:0

我有两个测试用例,其中调用了
data\u valid?
方法。第一个返回
false
,第二个返回
true
,为什么

    55: def data_valid? d
    56:   crc = d[-1]
    57:   data = d[1..-2]
    58:   len = d[0]
 => 59:   binding.pry
    60:   (data ^ len) == crc
    61: end

2.0.0 (#<MicroAeth::Message:0x007fbefc3ceae8>):0 > (data ^ len) == crc
=> false
2.0.0 (#<MicroAeth::Message:0x007fbefc3ceae8>):0 > (data ^ len)
=> "\xB1"
2.0.0 (#<MicroAeth::Message:0x007fbefc3ceae8>):0 > crc
=> "\xB1"
2.0.0 (#<MicroAeth::Message:0x007fbefc3ceae8>):0 > exit
have a good day!
F
From: /Users/rudolph9/Projects/CombustionEmissionsTesting/micro_aeth.rb @ line 59 MicroAeth::Message#data_valid?:

    55: def data_valid? d
    56:   crc = d[-1]
    57:   data = d[1..-2]
    58:   len = d[0]
 => 59:   binding.pry
    60:   (data ^ len) == crc
    61: end

2.0.0 (#<MicroAeth::Message:0x007fbefe83a8c8>):0 > (data ^ len) == crc
=> true
2.0.0 (#<MicroAeth::Message:0x007fbefe83a8c8>):0 > (data ^ len)
=> "+"
2.0.0 (#<MicroAeth::Message:0x007fbefe83a8c8>):0 > crc
=> "+"
我相信这与第一次比较非ASCII字符有关。如何正确设置条件?

您可以使用
String#force_encoding
将字符串强制为指定的编码

2.0.0-p195 :001 > "\xB1".encoding
 => #<Encoding:UTF-8> 
2.0.0-p195 :002 > eight_bit = "\xB1".force_encoding(Encoding::ASCII_8BIT)
 => "\xB1" 
2.0.0-p195 :003 > eight_bit.encoding
 => #<Encoding:ASCII-8BIT> 
2.0.0-p195 :004 > eight_bit == "\xB1"
 => false 
2.0.0-p195 :005 > eight_bit.force_encoding(Encoding::UTF_8) == "\xB1"
 => true
2.0.0-p195 :006 > eight_bit.force_encoding("\xB1".encoding) == "\xB1"
 => true
2.0.0-p195:001>“\xB1”。编码
=> # 
2.0.0-p195:002>八位=“\xB1”。强制编码(编码::ASCII8bit)
=>“\xB1”
2.0.0-p195:003>八位编码
=> # 
2.0.0-p195:004>八位==“\xB1”
=>错误
2.0.0-p195:005>八位强制编码(编码::UTF\U 8)==“\xB1”
=>正确
2.0.0-p195:006>八位强制编码(“\xB1”。编码)==“\xB1”
=>正确

注意Ruby 2.0.0的默认编码是UTF-8

字符串的编码是什么?请他们检查。@XiongChiamiov
2.0.0(#):0>crc.encoding=>2.0.0(#):0>(数据^len)。encoding=>2.0.0(#):0>(数据^len)。我在转换字符串进行比较时遇到问题:
2.0.0(#):0>(数据^len(#):0>crc.encode(data^len)。encoding encoding::InvaliByteSequenceError:“\xB1”在UTF-8上来自(pry):13:in
encode'
如何获得公共编码?出于比较目的,我只是将它们转换为整数
(data^len)==crc.byte
。但是,在哪里可以找到有关字符串编码的更详细信息?
2.0.0-p195 :001 > "\xB1".encoding
 => #<Encoding:UTF-8> 
2.0.0-p195 :002 > eight_bit = "\xB1".force_encoding(Encoding::ASCII_8BIT)
 => "\xB1" 
2.0.0-p195 :003 > eight_bit.encoding
 => #<Encoding:ASCII-8BIT> 
2.0.0-p195 :004 > eight_bit == "\xB1"
 => false 
2.0.0-p195 :005 > eight_bit.force_encoding(Encoding::UTF_8) == "\xB1"
 => true
2.0.0-p195 :006 > eight_bit.force_encoding("\xB1".encoding) == "\xB1"
 => true