文字コード

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 ビットで一文字を表現するもので、アルファベットと数字と少数の記号文字を表現できます。文字コードが表現できる文字集合を文字セットと呼びます。

7ビットASCIIコード
binary MSN  0 1 10 11 100 101 110 111
LSN  hex 0 1 2 3 4 5 6 7
0 0 NUL DLE 16  SP 32  0 48  @ 64  P 80  ` 96  p 112 
0 10 20 30 40 50 60 70
1 1 SOH 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 DC2 18  " 34  2 50  B 66  R 82  b 98  r 114 
2 12 22 32 42 52 62 72
11 3 ETX 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 DC4 20  $ 36  4 52  D 68  T 84  d 100  t 116 
4 14 24 34 44 54 64 74
101 5 ENQ NAK 21  % 37  5 53  E 69  U 85  e 101  u 117 
5 15 25 35 45 55 65 75
110 6 ACK SYN 22  & 38 6 54  F 70  V 86  f 102  v 118 
6 16 26 36 46 56 66 76
111 7 BEL ETB 23  ' 39  7 55  G 71  W 87  g 103  w 119 
7 17 27 37 47 57 67 77
1000 8 BS CAN 24  ( 40  8 56  H 72  X 88  h 104  x 120 
8 18 28 38 48 58 68 78
1001 9 HT 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) と呼びます。

改行コードの互換性
UnicodeASCIIEBCDIC
CR000D0D0D0D
LF000A0A2515
CRLF000D,000A0D,0A0D,250D,15
NEL0085851525
VT000B0B0B0B
FF000C0C0C0C
LS2028n/an/an/a
PS2029n/an/an/a


Copyright © 2003 SUGAI, Manabu. All Rights Reserved.