戻る

文字コード

revise: 2003/04/19

文字セットと文字コード

コンピュータでは、全てのデータは二進数で表現されます。二進数の羅列によって、プログラムや画像やテキストを表現します。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ビット文字をダブルバイト文字と呼んでいます。

文字コードは、表現対象の文字の集合を定義して、各々の文字に対してビット配列を対応させた規則のことです。表現する文字の集合のことを文字セットと呼びます。同じ文字セットを表現するにも複数の文字コードが存在するので、解釈時に文字コードを取り違えると、所謂文字化けが発生することになるわけです。

ASCII

最も有名なものが、 ASCII (American Standard Code for Information Interchange) として知られる 7 ビット文字コードです。原始的なものは 1969 年の RFC20 として知られています。8 ビット目は、エラーチェック用のパリティービットに使えるように、0 のままにしておきます。

英数字と幾つかの記号からなる 94 個の印字可能な文字 (0x210x7e) に、33 個の制御文字と、空白 (0x20) を加えた 128 個の文字セットを、0x00 から 0x7f までの 7 ビットのコードスペースにマッピングします。ここでは、制御文字に、0x7F = 0111 1111 をコードポジションとする削除 (del) を含みました。

7 ビット ASCII のコードポジション
コードエリア意味
0x000x1f制御文字
0x20空白
0x210x7e図形文字(英数字と記号)
0x7f制御文字(DEL)

現在の ASCII は RFC1345 で定義されています。本稿では、注釈なく ASCII と云うときは、この ASCII ではなく、7-bit ASCII (RFC20) を指すものとします。

IANA での登録情報は次のようになっています:

Name: ANSI_X3.4-1968                                   [RFC1345,KXS2]
MIBenum: 3
Source: ECMA registry
Alias: iso-ir-6
Alias: ANSI_X3.4-1986
Alias: ISO_646.irv:1991
Alias: ASCII
Alias: ISO646-US
Alias: US-ASCII (preferred MIME name)
Alias: us
Alias: IBM367
Alias: cp367
Alias: csASCII

ISO-2022

ASCII との互換性を保ちながら、多国語化の要請に応えたのが ISO-2022 であり、その仕様の下で日本語化したのが ISO-2022-JP です。俗に JIS コードと呼ばれています。ISO-2022-JP の符号化方法では、次の四種類のエスケープシーケンスを使って、 ASCII コードと日本語の共存を切り替えています。

エスケープシーケンスによって、一つのコードポイントが異なる文字セットの文字のポジションになります。半角カナや補助漢字を含めると、コードポジションの領域は次のようになります。

エスケープシーケンスASCII 表現1バイト目2バイト目文字の種類
00-1f,7f制御コード
1b+28+42[ESC] ( B20-7eASCII
1b+28+4a[ESC] ( J20-7eJISローマ字
1b+24+40[ESC] $ @21-7e21-7e旧JIS (78JIS)
1b+24+42[ESC] $ B21-7e21-7e新JIS (83JIS)
1b+28+49[ESC] ( I21-5f半角カナ
1b+24+44[ESC] $ D21-7e21-7eJIS補助漢字

[ESC] とあるのがエスケープ文字で、16 進数では "0x1b" になります。エスケープシーケンス後続の 2 文字の連続(エスケープシーケンス)が、文字セットの切り替えを意味しているわけです。

例えば、0x1b+(+B とすれば、後続の文字列は ACSII として解釈され、0x1b+$+B とすれば、後続の文字列は 1983 年に策定された JIS コードとして解釈されます。

ISO-2022-JP では、日本語の文字を 2 バイトで表現する一方で、ASCII は 8 ビット目を無視して 7 ビット解釈するので、同じ 0x3021 でも、"0x1B + $ + B" されている場合は漢字の「」になりますし、"0x1B + ( + B" されていれば、「0!」 になります。例えば、「」の場合は、JIS では 0x2422 となりますが、同じコードが ASCII では 「$"」 になります。

一般に、平仮名は 0x24 で始まる二バイト文字なので ACSII コードでは 「$+x」になり、カタカナは 0x25 で始まる二バイト文字なので ASCII コードでは「%+x」になります。半角カナは JIS8 と呼ばれる 8-bit 表現では a1-df (63 個)となり、先頭ビットを 0 にした 7-bit 表現の JIS7 では 21-5f となります。

大雑把に判断すると、ISO-2022 は、エスケープシーケンスによって、シングルバイトとダブルバイトを区別する、最大長 2 バイトの可変長文字コードです。

IANA での登録情報は次のようになっています:

Name: ISO-2022-JP  (preferred MIME name)               [RFC1468,Murai]
MIBenum: 39
Source: RFC-1468 (see also RFC-2237)
Alias: csISO2022JP

シフトJIS

ISO-2022 は、エスケーープシーケンスによって、文字のコードポイントを変更します。エスケープシーケンスが脱落すると、同じコードが、英数字を指したり、漢字を指したりするわけです。

英数字+半角カタカナ+制御文字という、シングルバイトのコードポイントと、ダブルバイトのコードポイントをずらしたものが、シフト JIS です。

1バイト目2バイト目文字の種類
00-1f, 7f制御コード
21-7eASCII
81-9F, e0-ef40-7e, 80-fc新JIS (83JIS)
a1-df半角カナ

エスケープシーケンスを採用せずに、1 バイト目に詰め込んだので、コードに余裕がなく、補助漢字の割り当てが困難です。

8 ビット目まで使うので、7 ビットまでしか保障しない SMTP (Simple Mail Transfer Protocol) に通すのは危険です。これは、EUC-JP や UTF-8 などでも同様です。

大雑把に判断すると、シフト JIS は、シングルバイト文字とダブルバイト文字のコードポイントを重複しないようにずらして、一バイト目を見ただけで何れか判断できる、最大長 2 バイトの可変長文字コードです。

IANA での登録情報は次のようになっています:

ame: Shift_JIS  (preferred MIME name)
MIBenum: 17
Source: This charset is an extension of csHalfWidthKatakana by
        adding graphic characters in JIS X 0208.  The CCS's are
        JIS X0201:1997 and JIS X0208:1997.  The
        complete definition is shown in Appendix 1 of JIS
        X0208:1997.
        This charset can be used for the top-level media type "text".
Alias: MS_Kanji 
Alias: csShiftJIS

EUC (Extended UNIX Code)

7 ビットである ASCII コードと重複するコードポイントを含んで、エスケープシーケンスで、文字のコードポイントを切り替えるものが JIS でした。Shit_JIS は、エスケープシーケンスを使わずに、シングルバイトとダブルバイトを、最初の一バイト目のコードエリアで区別するものでした。EUC は、最初の 1 ビット目の 0 に 1 を立てて漢字と ASCII を区別するものです。

1バイト目2バイト目3バイト目文字の種類
00-1f, 7f制御コード
21-7eASCII
a1-fea1-fe新JIS (83JIS)
8fa1-fea1-fe補助漢字
8ea1-df半角カナ

大雑把に判断すると、JIS とシフト JIS の折衷な感じで、処理が面倒な 3 バイト可変長文字コードです。補助漢字をサポートしない EUC-JP 環境が多く、特に、半角カナをサポートしない環境があるために、インターネットで半角カナを使ってはならないという文化の元凶となりました。

IANA での登録情報は次のようになっています:

Name: Extended_UNIX_Code_Packed_Format_for_Japanese
MIBenum: 18
Source: Standardized by OSF, UNIX International, and UNIX Systems
        Laboratories Pacific.  Uses ISO 2022 rules to select
               code set 0: US-ASCII (a single 7-bit byte set)
               code set 1: JIS X0208-1990 (a double 8-bit byte set)
                           restricted to A0-FF in both bytes
               code set 2: Half Width Katakana (a single 7-bit byte set)
                           requiring SS2 as the character prefix
               code set 3: JIS X0212-1990 (a double 7-bit byte set)
                           restricted to A0-FF in both bytes
                           requiring SS3 as the character prefix
Alias: csEUCPkdFmtJapanese
Alias: EUC-JP  (preferred MIME name)

EBCDIC

メインフレームで使われている、マルチバイトの文字コードです。EBCDIC (Extended BCD Interchange Code) は 8 ビットコードで、番号だけを定義した BCD (Binary Coded Decimal) を拡張したものです。

ダブルバイトにも拡張されており、シングルバイトのものを SBCS (Single Byte Character Set) と呼び、ダブルバイトのものを DBCS (Double Byte Character Set) と呼びます。シングルバイトとダブルバイトは、制御文字であるシフトアウト (SO, 0x0e) とシフトイン (SI, 0x0f) で切り替えます。つまり、ダブルバイト文字は、SO と SI で括られることになります。

IANA での登録情報は次のようになっています。

Name: IBM037                                              [RFC1345,KXS2]
MIBenum: 2028
Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
Alias: cp037
Alias: ebcdic-cp-us
Alias: ebcdic-cp-ca
Alias: ebcdic-cp-wt
Alias: ebcdic-cp-nl
Alias: csIBM037

他のものを含めて、IBM037, IBM038, IBM274, IBM275, IBM277, IBM278, IBM280, IBM281, IBM274, IBM285, IBM290, IBM297, IBM420, IBM423, IBM424, IBM500, IBM870, IBM871, IBM880, IBM905, IBM918, IBM00924, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, IBM1047 などのほか、EBCDIC-AT-DE, EBCDIC-AT-DE-A, EBCDIC-CA-FR, EBCDIC-DK-NO, EBCDIC-DK-NO-A などなど、非常に沢山のものが IANA に登録されています。

Unicode と UCS

Unicode

Unicode は、Unicode Consortium が策定している、 2 バイト固定長の文字符号化方法です。全ての文字を、一つの符号化方法で取り扱おうとするものです。既に、Windows や Java のネイティブな内部コードとしてデファクトスタンダードの地位を築いています。国際標準としての ISO/IEC 10646 も同様のコンセプトで仕様を策定しており、1992 年頃には、両者はすりあわされ、互換性を保ちつつ現在に至ります。

Unicode の最新版は Unicode V4.01 で、 ISO/IEC 10646-1:2000 (Universal Multiple-Octet Coded Character Set (UCS)--Part 1: Architecture and Basic Multilingual Plane) と互換性を保ちます。

UCS

ISO/IEC 10646 が定義する符号化方法が UCS (Universal Multiple-Octet Coded Character Set) で、32 ビット形式の UCS-4 (Universal Character Set coded in 4 octets) と、16 ビット形式の UCS-2 (Universal Character Set coded in 2 octets) に分けられます。

UCS-4 は、 231 個のコードポイントを持ち、コードスペースは、群 (group)、面 (plane)、区 (row)、点 (cell)に分けられます。群は 7-bit (128 個)で、面、区、点は 8-bit (256 個)です。

UCS-2 は、UCS-4 の群00面00を構成するもので、この面は BMP (Basic Multilingual Plane, 基本多言語面) と呼ばれます。Unicode V3.0 までと ISO/IEC 10646-1 は、BMP 以外の面の文字を定義していません。Unicode V3.1 以上で BMP の外のコードポジションに割り当てられた文字は、ISO/IEC 10646-1 と互換ではなく、UCS-2 の BMP の範囲のみが互換になります。

IANA での登録情報は次のようになっています:

Name: ISO-10646-UCS-4
MIBenum: 1001
Source: the full code space. (same comment about byte order,
        these are 31-bit numbers.
Alias: csUCS4

Name: ISO-10646-UCS-2
MIBenum: 1000
Source: the 2-octet Basic Multilingual Plane, aka Unicode
        this needs to specify network byte order: the standard
        does not specify (it is a 16-bit integer space)
Alias: csUnicode

UTF

UCS は固定長の文字符号化方法ですが、転送時に利用することを想定して、サイズを圧縮できる可変長の文字コードも、代替手段として定義されています。それが、UTF (UCS Transformation Format) です。

UTF にも複数種類あり、8 ビット形式の UTF-8 と、16 ビット形式の UTF-16 が代表的です。

UTF-8

UTF-8 は、ISO/IEC 10646 の全ての文字を表現可能です。1 オクテットで表現可能な範囲は 0x000x7f までとなり、 ASCII と完全に互換です。その他の文字は、ラテン語系の拡張文字が 2 オクテットになり、漢字などは 3 オクテットまで使います。Unicode では 0x10ffff まで指定しているので、UTF-8 では最大 4 オクテットになりますが、UCS-4 全体では、UTF-8 は最大 6 オクテットになります。

   Char. number range   |        UTF-8 octet sequence
      (hexadecimal)     |              (binary)
   ---------------------+---------------------------------------------
0x00000000 - 0x0000007F | 0xxxxxxx (7-bit ASCII)
0x00000080 - 0x000007FF | 110xxxxx 10xxxxxx 
0x00000800 - 0x0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx (BMP)
0x00010000 - 0x001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (Unicode)
0x00200000 - 0x03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
0x04000000 - 0x7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

非 ASCII 文字のコードは、MSB (最上位ビット)が 1 になっているため、7 ビットまでしか転送保障しない SMTP (Simple Mail Transfer Protocol) では、生のままでは扱えません。この点を回避するために、UTF-7 という 7 ビット形式の符号化方法も存在します。

UTF-16

UTF-16 は、ISO/IEC 10646 で定義される、グループ 00 に含まれる 16 プレーンのみ表現可能です。プレーン・ゼロの BMP のコードポイントは UCS-2 のまま使い、非 BMP の文字は、サロゲートペアで表現します。

UTF-16 の派生系に、UTF-16BE (Big Endian) と UTF-16LE (Little Endian) という区別があます。例えば、UCS-2の U+0041 を,UTF-16BE では 00 41 と表現し、UTF-16LE では 41 00 と表現します。

UTF-16 は BE も LE もみとめているので、それを区別するために、文書の多くは、文書の最初の 2 バイトに BOM (Byte Order Mark, U+FEFF) と呼ばれるコードを埋め込んでいます。これが FE FF であれば BE で解釈し、FF FE であれば LE で解釈します。Windows のネイティブコードである Unicode は、UTF-16LE であり、BOM はつきません。

IANA での登録情報は次のようになっています:

Name: UTF-8                                                    [RFC3629]
MIBenum: 106
Source: RFC 3629
Alias: None

Name: UTF-16BE                                                 [RFC2781]
MIBenum: 1013
Source: RFC 2781
Alias: None

Name: UTF-16LE                                                 [RFC2781]
MIBenum: 1014
Source: RFC 2781
Alias: None

Name: UTF-16                                                   [RFC2781]
MIBenum: 1015
Source: RFC 2781
Alias: None

他にも、UTF-7, UTF-32 などがあります。

改行コード

UNICODE では、下位7ビットが ASCII (Latin-1) と互換性を保つように設計されているので、空白類文字、アルファベット、数字は ASCII と同じです。特に、改行、空白などの空白類文字については、システム依存性があるので、認識しておくと良いでしょう。

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

EBCDIC は、IBM 互換メインフレーム機(ホスト系と呼ばれる)で使われている文字符号化方法で、エンタープライズでは標準的なものです。

戻る

Copyright 2003 SUGAI, Manabu. All rights reserved.
SEO [PR] !uO z[y[WJ Cu