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つの注意(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ