ASCIIとUnicode:それぞれ何で、何に使うのか

コンピューターが理解できるのは数だけなので、画面に見える文字はすべてコードです。ASCIIは標準になった最初のコード表で、Unicodeは今どんな言語でも書くために使われているコード表です。ここでは、その仕組み、知っておきたいコード、アクセントの代わりに変な記号が出る理由、表での調べ方を紹介します。

更新日:

文字コードとは

文字コードは約束事です。「65という数は文字Aを表す」という取り決めです。文章を書くと、プログラムはその数を保存し、別の人が開くと、その人のプログラムが同じ約束で数を文字に戻します。2人が同じ表を使っていないと、文字がおかしくなります。

2つの考え方を分ける必要があります。1つは文字集合、つまりどの数がどの記号に対応するかの一覧です。もう1つは、その数をバイトにどう保存するかです。ASCIIでは、この2つが単純に一致しますが、Unicodeでは一致せず、そこでUTF-8が登場します。

ASCII:7ビット、128文字

ASCII(American Standard Code for Information Interchangeの略)は1960年代に標準化されました。7ビット、つまり2の7乗 = 128個のコード(0〜127)を使います。そのうち33個が制御文字(0〜31と127)、95個が表示できる文字(32〜126、スペースを含む)です。

アクセント付きの文字も、ñも、ユーロ記号も、日本語も含まれていません。英語向けに設計されたからです。のちに別の表が必要になった理由がこれです。

最もよく目にするコードです。スペース(32)は、見えなくても表示できる文字に数えます。
制御文字10進数16進数2進数(7ビット)用途
ヌル (NUL)0000000000多くの言語で文字列の終わりを示す
水平タブ (TAB)9090001001次のタブ位置へ移る
改行 (LF)100A0001010次の行へ移る
復帰 (CR)130D0001101行の先頭に戻る
エスケープ (ESC)271B0011011制御シーケンスを開始する
スペース32200100000表示できる最初の文字
削除 (DEL)1277F1111111文字を消す

覚えておくと便利な関係

この表は適当に並んでいるわけではありません。いくつかの規則を知っていれば、コードを暗記で読めます。

改行:LF、CR、CRLF

改行は単純そうに見えますが、システムによって書き方が違います。Unix、Linux、macOSは1文字のLF(10)を使います。WindowsはCRとLFの2文字(13と10)を続けて使い、CRLFと呼ばれます。昔のテレタイプは、キャリッジを先頭に戻す命令と、紙を1行送る命令の2つが別々に必要でした。

この違いが、簡易エディタで全部が1行に見えたり、各行の末尾に妙な記号が付いたりするファイルの原因です。それぞれのコードを調べたいときは、ASCII表の検索欄にLFやCRと入力してください。

「拡張ASCII」は規格ではない

1バイトは8ビットで、ASCIIは7ビットしか使わないので、128個(128〜255)のコードが余り、メーカーや地域ごとに独自の使い方で埋めました。これが「拡張ASCII」と呼ばれるものですが、1つの表があるわけではなく、コードページと呼ばれる多くの表があります。有名なのは、éがコード233のLatin-1(ISO-8859-1)と、よく似ていて128〜159のコードに違いがある(たとえばユーロ記号がここにある)Windows-1252です。

問題は、コード233が、ある表では「é」を、別の表では別のものを意味することです。ある表で書いた文章を別の表で読むと、意味のない文字が表示されました。Unicodeは、この混乱を終わらせるために生まれました。

UnicodeとUTF-8

Unicodeは、世界のほぼすべての文字体系の文字と、記号、絵文字のそれぞれに、コードポイントと呼ぶ固有の数を割り当てます。現在は15万を超える文字があります。接頭辞U+を付けて16進数で書きます。「A」はU+0041、「ñ」はU+00F1、ユーロ記号はU+20AC、笑顔の絵文字はU+1F600です。最初の128個のコードポイントは、ASCIIとまったく同じです。

UTF-8は、その数をバイトに保存する最も広く使われている方法で、文字によって1〜4バイトを使います。ASCIIの128文字は従来どおりの1バイトで、ASCIIのテキストは有効なUTF-8のテキストでもあります。それ以外は、より多くのバイトを使います。

ASCIIから離れるほど、文字が使うバイト数が増えます。
文字コードポイントUTF-8のバイト数バイト(16進数)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

「ñ」の代わりに「ñ」が出る理由

最もよくあるエラーで、正確な説明があります。UTF-8のñは2バイト、C3とB1です。プログラムがテキストをLatin-1だと思い込むと、各バイトを1文字として読みます。C3は「Ã」、B1は「±」です。結果が「ñ」になります。「é」が「é」に、「canción」が「canción」に見えるのも同じです。

解決は、ほとんどの場合、プログラムにファイルをUTF-8として開くよう指定することです(テキストエディタや、表計算ソフトの読み込み設定で)。逆に、Latin-1のテキストをUTF-8として読むと、単独のバイトが有効なUTF-8の並びにならないため、疑問符のついたひし形が出ることがよくあります。

ASCII表と変換ツールの使い方

「ASCIIコード表」は、128文字を10進数、16進数、8進数、2進数のコードと、制御文字の名前で表示します。

  1. 検索欄に、文字、コード、または制御文字の名前(たとえばA、65、41、LF)を入力して、その行を探します。
  2. 絞り込みのボタン(制御文字、数字、大文字、小文字、記号)で、1つのグループだけを表示します。
  3. 変換するには、「テキスト」にテキストを入力し、形式(10進数、16進数、8進数、2進数)を選びます。下にコードが表示されます。「Hola」は10進数で72 111 108 97、16進数で48 6F 6C 61になります。
  4. 逆もできます。「コード」にスペースかカンマで区切ったコードを貼り付けると、テキストが組み立てられます。16進数では0x41のような接頭辞も使えます。

テキストにñのようなASCIIではない文字があると、ツールがそれを知らせ、そのUnicodeのコードを表示します。UTF-8での実際のバイトを見るには、「テキストを2進数に変換」を使ってください。ñは11000011 10110001、8ビット2つのバイトになります。制限として、表に出るのは標準のASCIIだけで拡張ASCIIはなく、計算はすべてブラウザ内で行われ、テキストがサーバーに送られることはありません。

よくある質問

ASCIIには何文字ありますか?

128文字で、コードは0〜127、各7ビットです。そのうち33個が制御文字、95個が表示できる文字(スペースを含む)です。

AとaのASCIIコードは?

「A」は65(16進数で41、2進数で01000001)、「a」は97(16進数で61、2進数で01100001)です。差は常に32です。

ASCIIとUnicodeの違いは?

ASCIIは英語向けの128文字です。Unicodeは、ほぼすべての言語と絵文字を含む15万以上の文字があり、最初の128個はASCIIと同じです。

UTF-8とは?

Unicodeのテキストをバイトに保存する、最も広く使われている方法です。1文字に1〜4バイトを使い、ASCIIの文字は1つ、ñは2つ、絵文字は4つです。

なぜテキストが「ñ」や「é」になるのですか?

UTF-8で保存されたテキストが、Latin-1として読まれているからです。ファイルをUTF-8と指定して開けば直ります。