2016-08-22 76 views
1

我有以下文件:编码默认到ASCII-8BIT

# encoding: UTF-8 
a = 1 << 7 
puts a.chr.encoding 

这让我回ASCII-8BIT。为什么这不会退回UTF-8我期望?

+0

因为ASCII字符0-> 127和UTF -8个字符0-> 127是相同的。 utf8 ** IS ** 7bit ascii,只考虑前128个字符。 utf8只在它设置的字节中的高位发挥作用时,它是utf8的“转义”字符,用来表示多字节序列的开始。 –

回答

3

chr具有编码参数,默认为US-ASCII,当炭是< 0x80和ASCII-8BIT为< 0xff(有UTF是相同的ASCII):

65.chr.encoding     # => #<Encoding:US-ASCII> 
128.chr.encoding     # => #<Encoding:ASCII-8BIT> 
255.chr.encoding     # => #<Encoding:ASCII-8BIT> 
256.chr.encoding     # => RangeError: 256 out of char range 

Encoding.default_internal = Encoding::UTF_8 
65.chr.encoding     # => #<Encoding:US-ASCII> 
255.chr.encoding     # => #<Encoding:ASCII-8BIT> 
256.chr.encoding     # => #<Encoding:UTF-8> 

65.chr(Encoding::UTF_8).encoding # => #<Encoding:UTF-8> 
128.chr(Encoding::UTF_8).encoding # => #<Encoding:UTF-8> 
500.chr(Encoding::UTF_8).encoding # => #<Encoding:UTF-8> 
+1

请注意[ASCII](https://en.wikipedia.org/wiki/ASCII)仅定义了128个字符。因此默认情况下,'chr'因此会返回7位代码(0..127)的“US-ASCII”和8位代码(128..255)的ASCII-8BIT。 – Stefan