概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Idiosyncratic Ruby: US-ASCII-8BIT
- 原文公開日: 2017/12/25
- 著者: Jan Lelis
- サイト: Idiosyncratic Ruby
Ruby: US-ASCII-8BITというエンコードを理解する(翻訳)
Rubyに2種類のASCIIエンコーディングがあるのはなぜでしょうか。
Encoding.name_list.grep(/ASCII/)
# => ["ASCII-8BIT", "US-ASCII"]
ASCIIエンコーディングに普通使うべきはこのどちらだかおわかりでしょうか?
別名で理解する
ASCII-8BIT | US-ASCII |
---|---|
BINARY | ASCII |
ANSI_X3.4-1968 | |
646 |
上の表のとおり、US-ASCIIとはいわゆるASCIIの別名です。とすると、ASCII-8BITの方は何なのでしょうか?EncodingsのRDocに役に立つ記述が少しあります。
Encoding::ASCII_8BIT
は、通常は(文字の文字列ではなく)バイト文字列に使われる特殊なエンコーディングの一種である。しかしこの名前が主張するように、ASCIIの範囲にある文字をASCII文字であるとみなされる。
これはASCII-8BIT文字とその他のASCII互換文字を併用する場合に有用である。
すなわち、ASCII-8BITは基本的に現実のエンコーディングではなく、任意のバイトストリーム(0から255までの値をとるバイト)を表すものであり、生のバイトストリームに用いたり、文字列のエンコーディングが不明であることを明示したりするときに用いられます。
いわゆるASCII文字セットは7ビットのみを使うため、厳密なASCIIでは8番目のビットを決して設定すべきではありません。これにより、ASCIIの値は0から127までとなります。以上がUS-ASCIIエンコーディングのすべてです。US-ASCIIエンコーディングはASCIIでエンコードされた文字列を扱うときに使うものであり、"ASCII-7BIT"とお考えください。
これらのエンコーディングの違いを以下のコード例で示します。
out_of_ascii_range = 128.chr # => "\x80"
out_of_ascii_range.force_encoding("US-ASCII").valid_encoding? # => false
out_of_ascii_range.force_encoding("ASCII-8BIT").valid_encoding? # => true