2014-02-08 95 views
1

任何人都可以解释这段代码是怎么回事?相同的字符串,不同的编码,但不等于Ruby

s1 = "\x20".force_encoding 'UTF-8' 
s2 = "\x20".force_encoding 'ASCII-8BIT' 
puts "s1 == s2: #{s1 == s2}" 

s3 = "\xAB".force_encoding 'UTF-8' 
s4 = "\xAB".force_encoding 'ASCII-8BIT' 
puts "s3 == s4: #{s3 == s4}" 

在Ruby 2.0.0p353它打印:

s1 == s2: true 
s3 == s4: false 

我不明白为什么S3和S4不相等时,S1和S2是。 0xAB是'½'的ASCII码,据我所知可以用ASCII-8BIT和UTF8表示。

+0

'\ 0xAB'也*不是*'½'作为UTF-8字符码。我发现这个:'“\ xAB”.force_encoding('CP850')。encode('UTF-8')' - 给出'½'。 。 。 http://en.wikipedia.org/wiki/Code_page_850 - 也许其他一些基于MSDOS的扩展也有这种映射。 –

+0

我不知道你在哪里得到了关于这是1/2码ASCII码的信息。它实际上是[左指双引号,左指guillemet](http://www.ascii-code.com/)。你的意思是'\ xBD'? – roippi

+0

谢谢@NeilSlater,这很有道理! – johnrl

回答

3

\xAB是不一样的\xAB,因为编码所述UTF-8是编码在多字节组,并且从\x80\xff字符被用于超过\x80码将数据编码符号。

但由于ASCII-8BIT是不特定的编码,但可以视为基于编码类,并化名为编码在。从\x80\xff的代码也不能转换任何编码。所以它就像ASCII基于代码页的抽象。

所以,如果你尝试从ASCII-8BIT转换为UTF-8你会得到的转换异常:

Encoding::UndefinedConversionError: "\xC9" from ASCII-8BIT to UTF-8 

但是,你能在8妥善处理符号使用显式位编码中设置代码页,和炭\xBD如下:

"\xBD".force_encoding('ISO-8859-1').encode('UTF-8') 
# => "½" 
"\xBD".force_encoding('CP1252').encode('UTF-8') 
# => "½" 
相关问题