2016-08-22 94 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