revise: 2003/04/19
コンピュータでは、全てのデータは二進数で表現されます。二進数の羅列によって、プログラムや画像やテキストを表現します。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ビット文字をダブルバイト文字と呼んでいます。
文字コードは、表現対象の文字の集合を定義して、各々の文字に対してビット配列を対応させた規則のことです。表現する文字の集合のことを文字セットと呼びます。同じ文字セットを表現するにも複数の文字コードが存在するので、解釈時に文字コードを取り違えると、所謂文字化けが発生することになるわけです。
最も有名なものが、 ASCII (American Standard Code for Information Interchange) として知られる 7 ビット文字コードです。原始的なものは 1969 年の RFC20 として知られています。8 ビット目は、エラーチェック用のパリティービットに使えるように、0 のままにしておきます。
英数字と幾つかの記号からなる 94 個の印字可能な文字 (0x21
~0x7e
) に、33 個の制御文字と、空白 (0x20
) を加えた 128 個の文字セットを、0x00
から 0x7f
までの 7 ビットのコードスペースにマッピングします。ここでは、制御文字に、0x7F
= 0111 1111
をコードポジションとする削除 (del) を含みました。
コードエリア | 意味 |
---|---|
0x00 ~0x1f | 制御文字 |
0x20 | 空白 |
0x21 ~0x7e | 図形文字(英数字と記号) |
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
ASCII との互換性を保ちながら、多国語化の要請に応えたのが ISO-2022 であり、その仕様の下で日本語化したのが ISO-2022-JP です。俗に JIS コードと呼ばれています。ISO-2022-JP の符号化方法では、次の四種類のエスケープシーケンスを使って、 ASCII コードと日本語の共存を切り替えています。
1b+28+42
= "[ESC] ( B
" → ASCII1b+28+4a
= "[ESC] ( J
" → JISローマ字 1b+24+40
= "[ESC] $ @
" → 旧JIS (78JIS)1b+24+42
= "[ESC] $ B
" → 新JIS (83JIS)エスケープシーケンスによって、一つのコードポイントが異なる文字セットの文字のポジションになります。半角カナや補助漢字を含めると、コードポジションの領域は次のようになります。
エスケープシーケンス | ASCII 表現 | 1バイト目 | 2バイト目 | 文字の種類 |
---|---|---|---|---|
00-1f,7f | 制御コード | |||
1b+28+42 | [ESC] ( B | 20-7e | ASCII | |
1b+28+4a | [ESC] ( J | 20-7e | JISローマ字 | |
1b+24+40 | [ESC] $ @ | 21-7e | 21-7e | 旧JIS (78JIS) |
1b+24+42 | [ESC] $ B | 21-7e | 21-7e | 新JIS (83JIS) |
1b+28+49 | [ESC] ( I | 21-5f | 半角カナ | |
1b+24+44 | [ESC] $ D | 21-7e | 21-7e | JIS補助漢字 |
[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
ISO-2022 は、エスケーープシーケンスによって、文字のコードポイントを変更します。エスケープシーケンスが脱落すると、同じコードが、英数字を指したり、漢字を指したりするわけです。
英数字+半角カタカナ+制御文字という、シングルバイトのコードポイントと、ダブルバイトのコードポイントをずらしたものが、シフト JIS です。
0x5c
を含む文字が問題になる1バイト目 | 2バイト目 | 文字の種類 |
---|---|---|
00-1f , 7f | 制御コード | |
21-7e | ASCII | |
81-9F , e0-ef | 40-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
7 ビットである ASCII コードと重複するコードポイントを含んで、エスケープシーケンスで、文字のコードポイントを切り替えるものが JIS でした。Shit_JIS は、エスケープシーケンスを使わずに、シングルバイトとダブルバイトを、最初の一バイト目のコードエリアで区別するものでした。EUC は、最初の 1 ビット目の 0 に 1 を立てて漢字と ASCII を区別するものです。
1バイト目 | 2バイト目 | 3バイト目 | 文字の種類 |
---|---|---|---|
00-1f , 7f | 制御コード | ||
21-7e | ASCII | ||
a1-fe | a1-fe | 新JIS (83JIS) | |
8f | a1-fe | a1-fe | 補助漢字 |
8e | a1-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 (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 は、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) と互換性を保ちます。
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
UCS は固定長の文字符号化方法ですが、転送時に利用することを想定して、サイズを圧縮できる可変長の文字コードも、代替手段として定義されています。それが、UTF (UCS Transformation Format) です。
UTF にも複数種類あり、8 ビット形式の UTF-8 と、16 ビット形式の UTF-16 が代表的です。
UTF-8 は、ISO/IEC 10646 の全ての文字を表現可能です。1 オクテットで表現可能な範囲は 0x00
~0x7f
までとなり、 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 は、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
UNICODE では、下位7ビットが ASCII (Latin-1) と互換性を保つように設計されているので、空白類文字、アルファベット、数字は ASCII と同じです。特に、改行、空白などの空白類文字については、システム依存性があるので、認識しておくと良いでしょう。
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 |
EBCDIC は、IBM 互換メインフレーム機(ホスト系と呼ばれる)で使われている文字符号化方法で、エンタープライズでは標準的なものです。
Copyright 2003 SUGAI, Manabu. All rights reserved.