Tech Racho エンジニアの「?」を「!」に。
  • 開発

Ruby: US-ASCII-8BITというエンコードを理解する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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

関連記事

Rubyの内部文字コードはUTF-8ではない…だと…?!

Unicodeで絶対知っておくべきセキュリティ5つの注意(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。