2016-08-22 4 views
1

Ich habe die folgende Datei:Encoding Säumigen zu ASCII-8BIT

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

Das gibt mir ASCII-8BIT zurück. Warum gibt das nicht UTF-8 zurück und ich würde erwarten? (UTF ist identisch mit ASCII dort)

+0

weil ASCII- Zeichen 0-> 127 und UTF -8 Zeichen 0-> 127 sind identisch. utf8 ** IS ** 7bit ascii, wenn nur die ersten 128 Zeichen berücksichtigt werden. utf8 kommt nur ins Spiel, wenn das High-Bit in dem Byte gesetzt ist, das utf8s "Escape" -Char ist, um den Start einer Multibyte-Sequenz zu signalisieren. –

Antwort

3

chr hat einen Codierungsparameter, auf die US-ASCII Verzug, wenn char < 0x80 und ASCII-8BIT für < 0xff ist:

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

Beachten Sie, dass [ASCII] (https://en.wikipedia.org/wiki/ASCII) nur 128 Zeichen definiert. 'chr' gibt daher' US-ASCII' für 7-Bit-Codes (0..127) und 'ASCII-8BIT' für 8-Bit-Codes (128..255) standardmäßig zurück. – Stefan