文字コードの話 (1) - ASCII
文字コードについて調べたことをまとめます。
関連記事
- 文字コードの話 (1) - ASCII (本記事)
- 文字コードの話 (2) - Shift_JIS
- 文字コードの話 (3) - Unicode
- 文字コードの話 (4) - UnicodeのEmoji
- Unicode変換ツール
目次
基本概念
文字コード(符号点, 符号位置, character code, code point)とは、図形である文字の集合符号化文字集合(CCS, coded character set, code page)に含まれるそれぞれの文字に割り振られた符号のことである。
我々が扱うコンピューターは、符号化文字集合に対応する文字符号化方式(CES, character encoding scheme)によってコードポイントとバイト表現を相互に変換することで、文字情報を記録したり文字図形をディスプレイに表示したりしている。
しかし、「文字コード」という言葉は上記の定義に反して符号化文字集合や文字符号化方式を指して使われることがある。この記事では混乱を防ぐため、「文字コード」の代わりに「コードポイント」あるいは「符号位置」という言葉を使うことにする。
例えばJIS X 0208において、文字「あ」のコードポイントは「4区2点」であり、このコードポイントをShift_JISでエンコードすると0x829Eとなる。
ASCII
ASCII
ASCII(American Standard Code for Information Interchange)は、1963年に制定された初期の文字エンコード規格。数字・ラテン文字・主要な記号・制御文字を7bitのbit列に割り当てたコードページ。エンコードはされずコードポイントがそのままbit列となる。
IANA(Internet Assigned Numbers Authority)には「US-ASCII」という名称で登録されている。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | � | |||||||||||||||
1 | ||||||||||||||||
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
- 最初の32文字は制御文字として定義されている。制御文字は文字図形を表す文字ではなく、ディスプレイやプリンターに対して命令を送るための信号を表す。
ほとんどの文字はコンピューターの利用者が意識することはないが、0x09=\t(水平タブ)、0x0A=\n(改行) など見慣れたコードポイントもこの制御文字に含まれている。 - コードポイント0x7Fは未定義。
ISO/IEC 646
ASCIIには「$」といったアメリカ特有の記号がある他、ヨーロッパ諸国ではASCIIに定義されている以外の文字も扱われるためASCIIでは十分な表現ができないという問題があった。
そこで1967年にECMAとISOは、ASCIIを一般化したISO/IEC 646という規格を制定する。ISO/IEC 646はASCIIの一部のコードポイントを各国の文字コード実装においてある程度自由に定義できる領域と定め、ASCIIはISO/IEC 646の実装の一つという位置付けとなった。
ISO/IEC 646には多数の実装があるが、例えばDIN 66003(ドイツの規格)ではASCIIと比べて0x5Bが「Ä」となっているといった変化がある。(ASCIIでは「[」)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | � | |||||||||||||||
1 | ||||||||||||||||
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | § | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | Ä | Ö | Ü | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | ä | ö | ü | ß | |
しかしながら、ISO/IEC 646はあまり使われることがなく、欧州では後述のISO/IEC 8859が一般的となる。
JIS X 0201
日本ではISO/IEC 646に準拠したISO646-JP(Code Page 895)という規格が制定され、更にそれを8bitに拡張してカタカナを加えたJIS X 0201(旧JIS C 6220)というコードページの規格が1969年に作られた。IANAには「JIS_X0201」として登録されている。
この規格は後にShift_JISで用いられることとなる。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | � | |||||||||||||||
1 | ||||||||||||||||
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
8 | ||||||||||||||||
9 | ||||||||||||||||
A | 。 | 「 | 」 | 、 | ・ | ヲ | ァ | ィ | ゥ | ェ | ォ | ャ | ュ | ョ | ッ | |
B | ー | ア | イ | ウ | エ | オ | カ | キ | ク | ケ | コ | サ | シ | ス | セ | ソ |
C | タ | チ | ツ | テ | ト | ナ | ニ | ヌ | ネ | ノ | ハ | ヒ | フ | ヘ | ホ | マ |
D | ミ | ム | メ | モ | ヤ | ユ | ヨ | ラ | リ | ル | レ | ロ | ワ | ン | ゙ | ゚ |
E | ||||||||||||||||
F |
ISO/IEC 8859
ASCIIやISO/IEC 646では不足している文字表現のため、1987年にISO/IEC 8859が制定された。ISO/IEC 646では7bitしか使っていなかったが、ISO/IEC 8859では8bit目を利用して表現可能な文字の数を2倍に増やした。
しかし、8bitまで使ってもまだ必要な全ての文字を収録することはできなかったため、ISO-8859-nという形で複数のコードページを定義することとなった。(n=1, ... 16)
例えばISO-8859-1は以下のように定義されていて、ドイツ語・フランス語・フィンランド語・デンマーク語などヨーロッパの広い範囲の文字を収録している。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | � | |||||||||||||||
1 | ||||||||||||||||
2 | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | |
3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
8 | ||||||||||||||||
9 | ||||||||||||||||
A | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | | ® | ¯ | |
B | ° | ± | ² | ³ | ´ | µ | ¶ | · | ¸ | ¹ | º | » | ¼ | ½ | ¾ | ¿ |
C | À | Á | Â | Ã | Ä | Å | Æ | Ç | È | É | Ê | Ë | Ì | Í | Î | Ï |
D | Ð | Ñ | Ò | Ó | Ô | Õ | Ö | × | Ø | Ù | Ú | Û | Ü | Ý | Þ | ß |
E | à | á | â | ã | ä | å | æ | ç | è | é | ê | ë | ì | í | î | ï |
F | ð | ñ | ò | ó | ô | õ | ö | ÷ | ø | ù | ú | û | ü | ý | þ | ÿ |
- 余談だがJava 1.5以前ではpropertiesファイルはISO-8859-1でエンコードしなければならないと定められていた。