文字コードとは
文字コードは約束事です。「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、スペースを含む)です。
アクセント付きの文字も、ñも、ユーロ記号も、日本語も含まれていません。英語向けに設計されたからです。のちに別の表が必要になった理由がこれです。
| 制御文字 | 10進数 | 16進数 | 2進数(7ビット) | 用途 |
|---|---|---|---|---|
| ヌル (NUL) | 0 | 00 | 0000000 | 多くの言語で文字列の終わりを示す |
| 水平タブ (TAB) | 9 | 09 | 0001001 | 次のタブ位置へ移る |
| 改行 (LF) | 10 | 0A | 0001010 | 次の行へ移る |
| 復帰 (CR) | 13 | 0D | 0001101 | 行の先頭に戻る |
| エスケープ (ESC) | 27 | 1B | 0011011 | 制御シーケンスを開始する |
| スペース | 32 | 20 | 0100000 | 表示できる最初の文字 |
| 削除 (DEL) | 127 | 7F | 1111111 | 文字を消す |
覚えておくと便利な関係
この表は適当に並んでいるわけではありません。いくつかの規則を知っていれば、コードを暗記で読めます。
- 数字の「0」〜「9」は48〜57(16進数で30〜39)です。数字の値は、コードから48を引いたものです。「7」は55で、55 − 48 = 7です。
- 大文字は65(「A」)から90(「Z」)、小文字は97(「a」)から122(「z」)です。
- 大文字とその小文字の差は常に32です。「A」= 65と「a」= 97、「C」= 67と「c」= 99。2進数では1ビットだけが変わります。「A」は01000001、「a」は01100001です。
- 大文字がアルファベットの何番目かを知るには、64を引きます。「C」は67で、67 − 64 = 3、3番目の文字です。
- 大文字(65〜90)のコードはすべて小文字(97〜122)より小さいので、「コード順」の並べ替えでは「Zebra」が「apple」の前に来ます。正しく並べ替えるには、別の比較オプションが必要なプログラムが多くあります。
改行: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のテキストでもあります。それ以外は、より多くのバイトを使います。
| 文字 | コードポイント | UTF-8のバイト数 | バイト(16進数) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 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進数のコードと、制御文字の名前で表示します。
- 検索欄に、文字、コード、または制御文字の名前(たとえばA、65、41、LF)を入力して、その行を探します。
- 絞り込みのボタン(制御文字、数字、大文字、小文字、記号)で、1つのグループだけを表示します。
- 変換するには、「テキスト」にテキストを入力し、形式(10進数、16進数、8進数、2進数)を選びます。下にコードが表示されます。「Hola」は10進数で72 111 108 97、16進数で48 6F 6C 61になります。
- 逆もできます。「コード」にスペースかカンマで区切ったコードを貼り付けると、テキストが組み立てられます。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と指定して開けば直ります。