Revised: Oct./05th/2003
XML文書が扱いやすい理由は、テキストファイルであることのほかに、XML仕様でUnicodeに準拠するように規定されていることが挙げられます。
Unicodeというのは、Unicode Consortiumによって策定されている文字コードで、現在Unicode 4まで策定されています。全ての国の言語を一つの文字符号化方法で表現する取り組みす。
Unicodeと同等のプロジェクトをISO/IECがキャリー中で、規格としてはISO/IEC 10646になります。ここで定義された文字セットをUCS (Universal Multiple-Octet Coded Character Set)と呼び、最大4バイトで定義されます。下位2バイトを基本多言語面 (BMP: Basic Multilingual Plane) と呼び、その文字コードを UCS-2、0 から 7FFFFFFF までの 4 バイト全体は UCS-4 と呼びます。UnicodeはUCS-2に該当します。
UCSの文字符号化スキームが UTF (UCS/Unicode Transformation Format)です。UTF-8, UTF-16, UTF-32 などの種類が存在します。UTF-8では、文字によって 8 ビットを一つから四つ使います。UTF-16 では、16 ビットを一つか二つ使って、UCS の群00 (Group 00) と呼ばれる範囲の文字 (8-bit * 8-bit * 8-bit) に含まれる文字を表現します。UTF-8 では 8 ビットを六つまでを定義しているので、UTF-16 よりもコード範囲が広く、群00-128 までの文字を表現できます。
XML仕様では、ISO/IEC 10646 の 10FFFF まで(一部の制御領域を除いた全ての Unicode 文字空間)に定義されている文字を使ってよいことになっています。文字符号化方法では、XML処理系は UTF-8 と UTF-16 を読めなければならないと規定しています。これら以外の文字コードを使う場合は、IANA (Internet Assigned Numbers Authority)に登録された文字コード名を XML 宣言の encoding
属性に指定するように推奨されています。
<?xml version="1.0" encoding="EUC-JP"?>
文字コードに関する詳細は、文字符号化方法を参照ください。
コンピュータでは、全てのデータは二進数で表現されます。二進数の羅列によって、プログラムや画像やテキストを表現します。0 か 1 を一つ保持できる単位をビットと呼び、文字は 8 ビット(8桁の二進数)か 16 ビットで表現します。8 ビットを 1 オクテットと呼び、一般には 1 オクテットを 1 バイトとします。 16 ビットのことはダブル・バイトと呼んでいます。
特定のビット配列がどの文字を表現するのかを決めている規則のことを文字コード(符号化方法)と呼んでおり、多くの文字コードが存在します。最も基本的な文字コードに ASCII (American Standard Code for Information Interchange, Latin-1) コードと呼ばれるものがあります。これは、7 ビットで一文字を表現するもので、アルファベットと数字と少数の記号文字を表現できます。文字コードが表現できる文字集合を文字セットと呼びます。
binary | MSN | 0 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LSN | hex | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||||||||
0 | 0 | NUL | 0 | DLE | 16 | SP | 32 | 0 | 48 | @ | 64 | P | 80 | ` | 96 | p | 112 |
0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | ||||||||||
1 | 1 | SOH | 1 | XON | 17 | ! | 33 | 1 | 49 | A | 65 | Q | 81 | a | 97 | q | 113 |
1 | (DC1) | 11 | 21 | 31 | 41 | 51 | 61 | 71 | |||||||||
10 | 2 | STX | 2 | DC2 | 18 | " | 34 | 2 | 50 | B | 66 | R | 82 | b | 98 | r | 114 |
2 | 12 | 22 | 32 | 42 | 52 | 62 | 72 | ||||||||||
11 | 3 | ETX | 3 | XOFF (DC2) | 19 | # | 35 | 3 | 51 | C | 67 | S | 83 | c | 99 | s | 115 |
3 | 13 | 23 | 33 | 43 | 53 | 63 | 73 | ||||||||||
100 | 4 | EOT | 4 | DC4 | 20 | $ | 36 | 4 | 52 | D | 68 | T | 84 | d | 100 | t | 116 |
4 | 14 | 24 | 34 | 44 | 54 | 64 | 74 | ||||||||||
101 | 5 | ENQ | 5 | NAK | 21 | % | 37 | 5 | 53 | E | 69 | U | 85 | e | 101 | u | 117 |
5 | 15 | 25 | 35 | 45 | 55 | 65 | 75 | ||||||||||
110 | 6 | ACK | 6 | SYN | 22 | & | 38 | 6 | 54 | F | 70 | V | 86 | f | 102 | v | 118 |
6 | 16 | 26 | 36 | 46 | 56 | 66 | 76 | ||||||||||
111 | 7 | BEL | 7 | ETB | 23 | ' | 39 | 7 | 55 | G | 71 | W | 87 | g | 103 | w | 119 |
7 | 17 | 27 | 37 | 47 | 57 | 67 | 77 | ||||||||||
1000 | 8 | BS | 8 | CAN | 24 | ( | 40 | 8 | 56 | H | 72 | X | 88 | h | 104 | x | 120 |
8 | 18 | 28 | 38 | 48 | 58 | 68 | 78 | ||||||||||
1001 | 9 | HT | 9 | EM | 25 | ) | 41 | 9 | 57 | I | 73 | Y | 89 | i | 105 | y | 121 |
9 | 19 | 29 | 39 | 49 | 59 | 69 | 79 | ||||||||||
1010 | A | LF | 10 | SUB | 26 | * | 42 | : | 58 | J | 74 | Z | 90 | j | 106 | z | 122 |
0A | 1A | 2A | 3A | 4A | 5A | 6A | 7A | ||||||||||
1011 | B | VT | 11 | ESC | 27 | + | 43 | ; | 59 | K | 75 | [ | 91 | k | 107 | { | 123 |
0B | 1B | 2B | 3B | 4B | 5B | 6B | 7B | ||||||||||
1100 | C | FF | 12 | FS | 28 | , | 44 | < | 60 | L | 76 | \ | 92 | l | 108 | | | 124 |
0C | 1C | 2C | 3C | 4C | 5C | 6C | 7C | ||||||||||
1101 | D | CR | 13 | GS | 29 | - | 45 | = | 61 | M | 77 | ] | 93 | m | 109 | } | 125 |
0D | 1D | 2D | 3D | 4D | 5D | 6D | 7D | ||||||||||
1110 | E | SO | 14 | RS | 30 | . | 46 | > | 62 | N | 78 | ^ | 94 | n | 110 | ~ | 126 |
0E | 1E | 2E | 3E | 4E | 5E | 6E | 7E | ||||||||||
1111 | F | SI | 15 | US | 31 | / | 47 | ? | 63 | O | 79 | _ | 95 | o | 111 | DEL | 127 |
0F | 1F | 2F | 3F | 4F | 5F | 6F | 7F |
エンタープライズ・システムで使われているメインフレームでは EBCDIC (Extended Binary Coded Decimal Interchange Code) と呼ばれる文字コードが使われています。また、日本語では SHIFT_JIS, JIS (ISO2022-JP), EUC-JP などの文字コードが使われており、表現する文字の数が 8 桁のビット配列では表現し尽くせないので、16 桁のビット配列を割り当てています。このため、 ASCII コードの文字をシングルバイト文字と呼び、日本語のような 16 ビット文字をダブルバイト文字と呼んでいます。
ISO-2022-JP は、ASCII と同じ 7-bit コードポイントを使って、エスケープシーケンスと呼ばれる文字列にで、シングルバイトとダブルバイトを切り替えるものです。ISO-2022-JP のダブルバイトで表現される文字セットは、JIS に準拠しています。Shift_JIS は、エスケープシーケンスを使わず、2 バイト文字の 1 バイト目を、7-bit ASCII とは異なるコードポイントにずらすことによって表現するものです。EUC-JP は、7-bit ASCII の 1 ビット目に 1 を立てることによって、文字領域を拡張したもので、ISO-2022-JP の漢字コードの先頭ビットに 1 を立てたものになります。
文字コードは、表現対象の文字の集合を定義して、各々の文字に対してビット配列を対応させた規則のことです。表現する文字の集合のことを文字セットと呼びます。同じ文字セットを表現するにも複数の文字コードが存在するので、解釈時に文字コードを取り違えると、所謂文字化けが発生することになるわけです。
Unicode では、下位 7 ビットが 7-bit ASCII と互換性を保つように設計されているので、空白類文字、アルファベット、数字は ASCII と同じです。特に、改行、空白などの空白類文字については、システム依存性があるので、認識しておくと良いでしょう。
EBCDIC は、IBM 互換メインフレーム機(ホスト系と呼ばれる)で使われている文字符号化方法で、エンタープライズでは標準的なものです。もともとは 8-bit コードですが、多くの派生コードが存在し、マルチバイトに拡張しています。マルチバイトへの変更する制御文字をシフトアウト (SO, Shift-Out) と呼び、シングルバイトに戻る制御コードをシフトイン (SI, Shift-In) と呼びます。
Unicode | ASCII | EBCDIC | ||
---|---|---|---|---|
CR | 000D | 0D | 0D | 0D |
LF | 000A | 0A | 25 | 15 |
CRLF | 000D,000A | 0D,0A | 0D,25 | 0D,15 |
NEL | 0085 | 85 | 15 | 25 |
VT | 000B | 0B | 0B | 0B |
FF | 000C | 0C | 0C | 0C |
LS | 2028 | n/a | n/a | n/a |
PS | 2029 | n/a | n/a | n/a |