「文字コード」とは、文字をコンピューターで表現する際にどのようなバイト表現にするかを定めるもので、下記の概念を持ちます。
用語 | 説明 |
---|---|
文字集合 | 符号化文字集合(CCS:Coded Character Set)、キャラクタセット とも呼びます。文字に番号を割り振ります。主な文字集合として JIS X 0208 や Unicode があります。これらの規約では、文字に「群・面・区・点」の番号を割り振ります。群は 0~127、面・区・点は 0~255 の数値をとります。すべて使用すると 128×256×256×256=2,147,483,648文字を表すことができますが、JIS X 0208 では1~94区×1~94点のみの 94×94=8,836文字、Unicode では 0~16面×0~255区×0~255点の 17×256×256=1,114,112文字の範囲で文字を定義しています。例えば文字の「あ」は、JIS X 0208 では「4区1点」、Unicodeでは「0面48区66点」の番号を割り振っています。 |
符号化方式 | 文字符号化方式(CES:Character Encoding Scheme)、エンコーディングルール とも呼びます。文字集合で定義した「群・面・区・点」の番号を、どのようなバイト列に変換するかのルールを決めます。JIS X 0208 を符号化する方式としては、ISO-2022-JP(俗にいうJISコード)、Shift_JIS、EUC など、Unicode を符号化する方式としては、UTF-8, UTF-16 などがあります。 |
大分類 | 文字集合 | 符号化方式 | 説明 |
---|---|---|---|
半角系 | ASCII | 米国規約。半角英数記号文字を定義したもの。7ビット。 | |
ISO/IEC 646 | 国際規格。ASCIIを各国語に拡張したもの。7ビット。 | ||
JIS X 0201 | ISO/IEC 646 の日本カスタマイズ版。英数字・記号・半角カナを定義。旧称 JIS C 6220。 | ||
ISO-8859 | 欧州系の文字を定めたもの。8ビット。 | ||
制御文字 | ISO/IEC 6429 | 制御文字を定義。 | |
JIS X 0211 | ISO/IEC 6429 の日本版。旧称 JIS C 6223。 | ||
JIS系 | JIS X 0208 | 平仮名、片仮名、漢字などの日本語を定義。 | |
ISO-2022-JP | 主に電子メールで利用される。俗にいう JISコード。 | ||
EUC-JP | 主に Linux 系システムで使用される。 | ||
Shift_JIS | 主に Windows 系システムで使用される。 | ||
JIS X 0212 | 通称「JIS補助漢字」。あまり使用されていない。 | ||
JIS X 0213 | 通称「JIS2000」「JIS2004」。第三水準・第四水準漢字を定義。 | ||
Unicode系 | Unicode | UTF-8 | Unicode で一番よく利用される形式。ASCIIは1バイト、日本語は3バイトで表現。 |
UTF-16 | Unicode を 16ビットで表現。 | ||
UTF-32 | Unicode を 32ビットで表現。 |
関連用語:
American Standard Code for Information Interchangeの略です。1963年に米国のASA(現在のANSI)が制定した 7ビット文字集合です。0x00~0x7F のバイトコードの中に 33文字の制御文字と、95文字の半角英数記号文字を定義しています。まだ文字集合と符号化方式という概念が生まれる前の文字コード体系です。最初は小文字の定義もなく、制御文字も異なっていましたが、1967年の改定でほぼ現在の定義になりました。
上位4ビット | |||||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
下 位 4 ビ ッ ト | 0 | NUL | DLE | SP | 0 | @ | P | ` | p |
1 | SOH | DC1 | ! | 1 | A | Q | a | q | |
2 | STX | DC2 | " | 2 | B | R | b | r | |
3 | ETX | DC3 | # | 3 | C | S | c | s | |
4 | EOT | DC4 | $ | 4 | D | T | d | t | |
5 | ENQ | NAK | % | 5 | E | U | e | u | |
6 | ACK | SYN | & | 6 | F | V | f | v | |
7 | BEL | ETB | ' | 7 | G | W | g | w | |
8 | BS | CAN | ( | 8 | H | X | h | x | |
9 | HT | EM | ) | 9 | I | Y | i | y | |
A | LF | SUB | * | : | J | Z | j | z | |
B | VT | ESC | + | ; | K | [ | k | { | |
C | FF | FS | , | < | L | \ | l | | | |
D | CR | GS | - | = | M | ] | m | } | |
E | SO | RS | . | > | N | ^ | n | ~ | |
F | SI | US | / | ? | O | _ | o | DEL |
下記の版があります。
ASCII の規約を取り込みながら 1967年に ISO が制定した国際規格です。欧州でもほぼ同等の ECMA-6 を制定しています。当初は番号記号(#)が国際通貨記号(¤)に、チルダ(~)がオーバーライン(‾)になっている点が異なっていましたが、1991年の改定で番号記号(#) とチルダ(~)に変更されました。ただし、下記で色付きの文字(2/3-4, 4/0, 5/11-14, 6/0, 7/11-14) は推奨文字であり、各言語で別の文字を割り当ててもよいと規定されました。日本ではこの規格をベースに JIS X 0201 を制定しました。欧州各国でも同様の規格が制定されましたが、あまり使用されず、代わりに8ビット領域を使用した ISO/IEC 8859 が使用されています。
上位4ビット | |||||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
下 位 4 ビ ッ ト | 0 | NUL | DLE | SP | 0 | @ | P | ` | p |
1 | SOH | DC1 | ! | 1 | A | Q | a | q | |
2 | STX | DC2 | " | 2 | B | R | b | r | |
3 | ETX | DC3 | # | 3 | C | S | c | s | |
4 | EOT | DC4 | $ | 4 | D | T | d | t | |
5 | ENQ | NAK | % | 5 | E | U | e | u | |
6 | ACK | SYN | & | 6 | F | V | f | v | |
7 | BEL | ETB | ' | 7 | G | W | g | w | |
8 | BS | CAN | ( | 8 | H | X | h | x | |
9 | HT | EM | ) | 9 | I | Y | i | y | |
A | LF | SUB | * | : | J | Z | j | z | |
B | VT | ESC | + | ; | K | [ | k | { | |
C | FF | FS | , | < | L | \ | l | | | |
D | CR | GS | - | = | M | ] | m | } | |
E | SO | RS | . | > | N | ^ | n | ~ | |
F | SI | US | / | ? | O | _ | o | DEL |
下記の版があります。
ISO/IEC 646 を日本向けにカスタマイズし、1969年に日本工業規格(JIS) が制定しました。制定当時は JIS C 6220 でしたが、JIS の情緒部門(X)設立に伴い、JIS X 0201(ローマ字/半角カナ文字) に名称変更されました。ASCII とは、5/12 のバックスラッシュ(\)が円記号(¥)に、7/14 のチルダ(~)がオーバーライン(‾)になっている点が異なります。また、8ビット空間を用いて半角カナ文字も定義しています。
上位4ビット | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | ||
下 位 4 ビ ッ ト |
0 | NUL | DLE | SP | 0 | @ | P | ` | p | ー | タ | ミ | |||||
1 | SOH | DC1 | ! | 1 | A | Q | a | q | 。 | ア | チ | ム | |||||
2 | STX | DC2 | " | 2 | B | R | b | r | 「 | イ | ツ | メ | |||||
3 | ETX | DC3 | # | 3 | C | S | c | s | 」 | ウ | テ | モ | |||||
4 | EOT | DC4 | $ | 4 | D | T | d | t | 、 | エ | ト | ヤ | |||||
5 | ENQ | NAK | % | 5 | E | U | e | u | ・ | オ | ナ | ユ | |||||
6 | ACK | SYN | & | 6 | F | V | f | v | ヲ | カ | ニ | ヨ | |||||
7 | BEL | ETB | ' | 7 | G | W | g | w | ァ | キ | ヌ | ラ | |||||
8 | BS | CAN | ( | 8 | H | X | h | x | ィ | ク | ネ | リ | |||||
9 | HT | EM | ) | 9 | I | Y | i | y | ゥ | ケ | ノ | ル | |||||
A | LF | SUB | * | : | J | Z | j | z | ェ | コ | ハ | レ | |||||
B | VT | ESC | + | ; | K | [ | k | { | ォ | サ | ヒ | ロ | |||||
C | FF | IS4 | , | < | L | ¥ | l | | | ャ | シ | フ | ワ | |||||
D | CR | IS3 | - | = | M | ] | m | } | ュ | ス | ヘ | ン | |||||
E | SO | IS2 | . | > | N | ^ | n | ‾ | ョ | セ | ホ | ゙ | |||||
F | SI | IS1 | / | ? | O | _ | o | DEL | ッ | ソ | マ | ゚ |
下記の版があります。
ISO/IEC 646 ではカスタマイズできる文字数が少なすぎたため、欧州を中心に独自に制定した 8ビットコード体系です。
規格 | 説明 |
---|---|
ISO-8859-1 | Latin-1 西欧諸語。英語、ドイツ、フランス、イタリア、スペイン、ポルトガル、オランダ、デンマーク、アイスランド、アイルランド、ノルウェー、スウェーデン語など。 |
ISO-8859-2 | Latin-2 中央欧諸語。ボスニア、ポーランド、クロアチア、チェコ、スロバキア、スロベニア、ハンガリー語など。 |
ISO-8859-3 | Latin-3 南欧諸語。トルコ、マルタ、エスペラント語など。 |
ISO-8859-4 | Latin-4 北欧諸語。エストニア、ラトビア、リトアニア、グリーンランド語など。 |
ISO-8859-5 | Cyrillic キリル文字。ロシア、ベラルーシ、ブルガリア、マケドニア、セルビア、ウクライナ語など。 |
ISO-8859-6 | Arabic アラビア語 |
ISO-8859-7 | Greek ギリシャ語 |
ISO-8859-8 | Hebrew ヘブライ語 |
ISO-8859-9 | Latin-5 トルコ語 |
ISO-8859-10 | Latin-6 北欧語 |
ISO-8859-11 | タイ語。 |
ISO-8859-12 | 予約 |
ISO-8859-13 | Latin-7 Baltic Rim。 |
ISO-8859-14 | Latin-8 Celtic。 |
ISO-8859-15 | Latin-9 Latin-1の改定 |
ISO-8859-16 | Latin-10 Latin-2の改定 |
C0領域(0x00~0x1F)、C1領域(0x80~0x9F) の制御文字を定義します。
上位4ビット | ||||||||
---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | ... | 7 | 8 | 9 | ||
下 位 4 ビ ッ ト |
0 | NUL | DLE | ... | - | DCS | ||
1 | SOH | DC1 | ... | - | PU1 | |||
2 | STX | DC2 | ... | BPH | PU2 | |||
3 | ETX | DC3 | ... | NBH | STS | |||
4 | EOT | DC4 | ... | - | CCH | |||
5 | ENQ | NAK | ... | NEL | MW | |||
6 | ACK | SYN | ... | SSA | SPA | |||
7 | BEL | ETB | ... | ESA | EPA | |||
8 | BS | CAN | ... | HTS | SOS | |||
9 | HT | EM | ... | HTJ | - | |||
A | LF | SUB | ... | VTS | SCI | |||
B | VT | ESC | ... | PLD | CSI | |||
C | FF | IS4 | ... | PLU | ST | |||
D | CR | IS3 | ... | RI | OSC | |||
E | SO | IS2 | ... | SS2 | PM | |||
F | SI | IS1 | ... | DEL | SS3 | APC |
下記の版があります。
ISO/IEC 6429 とほぼ同等内容の JIS 規格です。
下記の版があります。
平仮名、片仮名、漢字などの日本語の文字コードを定義します。1~84区を使用し、各区には 1~94点までの文字を定義しています。1978年に JIS C 6226 として定義され、後に JIS X 0208 に名称変更しました。第一水準、第二水準と呼ばれる漢字を定義しています。1-2区に全角記号、3区全角数字・ローマ字、4区平仮名、5区片仮名、6区ギリシャ文字、7区キリル文字、8区罫線16~47区第一水準漢字、48~84区第二水準漢字を定義しています。
下記の文字が定義されています。
下記の版があります。
JIS C 6226-1983:2区:記号追加(39字) ∠ ⊥ ⌒ ∂ ∇ ≡ ≒ ≪ ≫ √ ∽ ∝ ∵ ∫ ∬ ∈ ∋ ⊆ ⊇ ⊂ ⊃ ∪ ∩ ∧ ∨ ¬ ⇒ ⇔ ∀ ∃ ♯ ♭ ♪ † ‡ ¶ ◯ Å ‰ JIS C 6226-1983:8区:罫線文字追加(32字) ─ │ ┌ ┐ ┘ └ ├ ┬ ┤ ┴ ┼ ━ ┃ ┏ ┓ ┛ ┗ ┣ ┳ ┫ ┻ ╋ ┠ ┯ ┨ ┷ ┿ ┝ ┰ ┥ ┸ ╂ JIS C 6226-1983:第一水準と第二水準入れ替え(22組) 鯵鰺 鴬鶯 蛎蠣 撹攪 竃竈 潅灌 諌諫 頚頸 砿礦 蕊蘂 靭靱 賎賤 壷壺 砺礪 梼檮 涛濤 迩邇 蝿蠅 桧檜 侭儘 薮藪 篭籠 JIS C 6226-1983:第一水準の字形変化と旧字形を第二水準(84区)に移動(4字) 尭堯 槙槇 遥遙 瑶瑤 JIS X 0208-1990:第二水準(84区)に漢字追加(2字) 凜 熙
JIS X 0208 に足りない文字を追加したもので、特殊文字(21字)、アルファベット(245字)、補助漢字(5,801字)、合計(6,067字)を定義しています。1990年に制定されましたが、Shift_JIS との相性が悪くあまり使用されていません。
下記の版があります。
JIS X 0212 の代わりに 2000年に制定されました。JIS X 0208(第1面) の空き領域に第三水準漢字を、また、第2面に第四水準漢字を定義しました。
下記の文字が定義されています。
下記の版があります。
文字数は下記の様に変化しています。
規格 | 俗称 | 非漢字 | 第一水準 | 第二水準 | 第三水準 | 第四水準 | 合計 |
---|---|---|---|---|---|---|---|
JIS C 6226-1978 | JIS78、78JIS、旧JIS | 453字 | 2,965字 | 3,384字 | 6,802字 | ||
JIS C 6226-1983 | JIS83、83JIS、新JIS | 524字 | 3,388字 | 6,877字 | |||
JIS X-0208-1983 | |||||||
JIS X 0208-1990 | JIS90、90JIS | 3,390字 | 6,879字 | ||||
JIS X 0208-1997 | JIS97、97JIS | ||||||
JIS X 0213-2000 | JIS2000、2000JIS | 1,183字 | 1,249字 | 2,436字 | 11,223字 | ||
JIS X 0213-2004 | JIS2004、2004JIS | 1,259字 | 11,233字 |
電子メール等で利用される符号化方式です。俗にいう「JISコード」。JIS X 0211 の制御文字、JIS X 0201 のローマ字、JIS X 0208 の文字をバイト列に符号化します。ESC(0x1B) で始まるエスケープシーケンスで、その後に続く文字集合を指定します。全角文字は、区番号、点番号にそれぞれ 0x20 を足します。すべてのバイトが 0x00~0x7F の範囲に収まります。
A | B | C | (漢字) | あ | い | う | (ASCII) | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|
41 | 42 | 43 | 1B 24 42 | 24 22 | 24 24 | 24 26 | 1B 28 42 | 58 | 59 | 5A |
エスケープシーケンスには下記などがあります。
規格 | 記号表記 | 16進表記 | 意味 |
---|---|---|---|
ISO-2022-JP | ESC ( B | 1B 28 42 | ASCII。 |
ESC ( J | 1B 28 4A | JIS X 6220(JIS X 0201)-1976 ラテン文字集合 | |
ESC $ @ | 1B 24 40 | JIS C 6226(JIS X 0208)-1978(通称:旧JIS) | |
ESC $ B | 1B 24 42 | JIS X 0208-1983(通称:新JIS) または JIS X 0208-1990 | |
ISO-2022-JP-1 で追加 | ESC $ ( D | 1B 24 28 44 | JIS X 0212-1990(JIS補助漢字) |
ISO-2022-JP-2 で追加 | ESC $ A | 1B 24 41 | GB 2312-80(中国語) |
ESC $ ( C | 1B 24 28 43 | KS X 1001-1992(韓国語) | |
ESC . A | 1B 2E 41 | ISO/IEC 8859-1 の右半分 | |
ESC . F | 1B 2E 46 | ISO/IEC 8859-7 の右半分 | |
ISO-2022-JP-3 で追加 | ESC $ ( O | 1B 24 28 4F | JIS X 0213:2000の1面 |
ESC $ ( P | 1B 24 28 50 | JIS X 0213:2000の2面 | |
ISO-2022-JP-2004 | ESC $ ( Q | 1B 24 28 51 | JIS X 0213:2004の1面 |
ISO-IR 013 | ESC ( I | 1B 28 49 | JIS X 0201(半角カナ) ... 一部のソフトでのみ利用 |
ISO-2022-JP に類似した符号化方式には下記などがあります。
規格 | 説明 |
---|---|
CP50220 | Microsoft による規格。ISO-2022-JP の Windows-31J版。半角カナを JIS X 0208 の全角カナに変換して表します。 |
CP50221 | CP50220 と類似していますが、半角カナを ESC ( I でエスケープして表します。 |
CP50222 | CP50220 と類似していますが、SO(0x0E)で半角カナの始まり、SI(0x0F)で終わりを示します。 |
ISO-2022-JP-MS | Linux陣営が規定した独自規格。半角カナは ESC ( I、外字を ESC $ ( ? でエスケープします。 |
Extended UNIX Code Packed Format for Japanese の略。UNIX/Linix 系のシステムで使用される符号化方式です。ASCII と JIS X 0208(漢字)、JIS X 0201(半角カナ) を扱います。漢字は区点番号に 0xA0 を足すと EUC となります。例えば、「あ」(4区2点)は、0x04 0x02 + 0xA0 0xA0 = 0xA4 0xA2 で「あ」となります。半角カナは SS2(0x8E) を付加します。
A | B | C | あ | い | う | ア | イ | ウ |
---|---|---|---|---|---|---|---|---|
41 | 42 | 43 | A4 A2 | A4 A4 | A4 A6 | 8E B1 | 8E B2 | 8E B3 |
Windows 系で使用される符号化方式です。JIS X 0208 の付属書で「シフト符号化表現」という名称で定義されています。半角文字(制御文字・英数記号・半角カナ)は JIS X 0201 の文字をそのまま使用し、全角文字は、1バイト目を JIS X 0201 で未使用の 0x81~0x9F、0xE0~0xEF、2バイト目を 0x40~0x7E、0x80~0xFC の領域に計算式でシフトして符号化します。
A | B | C | あ | い | う | ア | イ | ウ |
---|---|---|---|---|---|---|---|---|
41 | 42 | 43 | 82 A0 | 82 A2 | 82 A4 | B1 | B2 | B3 |
文字の割り当ては次のようになります。
1バイト目 | 2バイト目 | 説明 |
---|---|---|
0x00~0x1F | 制御文字 | |
0x20~0x7E | 英数記号文字 | |
0x7F | 制御文字(DEL) | |
0x81~0x9F | 0x40~0x7E, 0x80~0xFC | JIS X 0213(1面:前半) |
0xA1~0xDF | 半角カナ | |
0xE0~0xEF | 0x40~0x7E, 0x80~0xFC | JIS X 0213(1面:後半) |
0xF0~0xFC | 0x40~0x7E, 0x80~0xFC | JIS X 0213(2面) |
区番号を c1、点番号を c2 とした場合、Shift_JIS の 1バイト目 b1、2バイト目 b2 は下記の計算で求められます。
if (c1 % 2) { b1 = int((c1 + 1) / 2) + 0x80; b2 = c2 + 0x3f; } else { b1 = int(c1 / 2) + 0x80; b2 = c2 + 0x9d; } if (b1 >= 0xa0) { b1 = b1 + 0x40; } if (b2 >= 0x7f) { b2 = b2 + 1; }
Shift_JIS に関連した符号化方式には下記などがあります。
符号化方式 | 説明 |
---|---|
MS漢字コード (CP932) | マイクロソフトが 1982年に定めた文字コード。JIS C 6226-1978 で定義される文字集合を、半角カタカナが使用する 0xA1~0xDF、および DEL(0x7F) の領域を避けるように巧みにシフトさせたものです。ただし、未使用の領域に各社が独自の文字を割り当て、「NEC版CP932」 や 「IBM版CP932」が現れるなど、混乱が生じていました。 |
Windows-31J (MS932) | マイクロソフトが 1993年に定めた文字コード。上記の混乱を収拾するために各社独自実装の内、広く使用されているものだけを仕様に取り込み、以後の各社独自実装を禁止したものです。JIS X 0208-1990 をベースとし、13区に83字の「NEC特殊文字」を、89~92区に374字の「NEC選定IBM拡張文字」を、115~119区に 388字の「IBM拡張文字」を追加しています。CP932 と区別するために MS932 とも呼ばれます。 |
Shift_JISX0213 | JIS X 0213 に対応したもの。 |
Shift_JIS-2004 | JIS X 0213:2004 の改定に対応したもの。 |
JIS系文字集合のそれぞれの符号化方式によるマッピングは次のようになります。
世界中の文字を一つのコード体系で表現しようとして制定されたものです。日本で定義された文字も取り込まれていますが、CJK(中国語・日本語・韓国語)で字形の似たものを統一するなどしています。JIS系のコードとは変換表を用いて変換します。当初は、16ビット=256区×256点=65,535字の中に収めようとしていましたが、現在では0面~16面を使用し、21ビット=17面×256区×256点=1,114,112字の領域に拡大しています。例えば日本語の「あ」は「0面48区66点」と定義されています。「0-48-66」の様に表現したり、48 → 0x30、66 → 0x42 と 16進数に変換して「U+3042」の様に表したりします。
Unicode系で一番利用されている符号化方式です。ASCII文字を 1バイトで表現できるように、U+007F までの文字は 1バイト、U+07FF までの文字は 2バイト、U+FFFF までの文字は 3バイトで表現します。U+10000~U+10FFFF の文字は、本来の UTF-8 では 4バイトに変換しますが、Oracle データベースなど一部のシステムでは サロゲートペア を用いる方式(CESU-8)で 6バイトに変換することもあります。
範囲 | ビット数 | 変換元ビット | 変換後ビット |
---|---|---|---|
U+0000~U+007F | 7bits | 0xxxxxxx | 0xxxxxxx (00-7F) |
U+0080~U+07FF | 11bits | 00000yyy xxxxxxxx | 110yyyxx 10xxxxxx (C0-DF) (80-BF) |
U+0800~U+FFFF | 16bits | yyyyyyyy xxxxxxxx | 1110yyyy 10yyyyxx 10xxxxxx (E0-EF) (80-BF) (80-BF) |
U+10000~U+10FFFF (本来のUTF-8方式) |
21bits | zzzzz yyyyyyyy xxxxxxxx | 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx (F0-F7) (80-BF) (80-BF) (80-BF) |
U+10000~U+10FFFF (CESU-8方式) |
21bits | zzzzz yyyyyyyy xxxxxxxx ↓ (wwww = zzzzz-1) High:110110ww wwyyyyyy Low: 110111yy xxxxxxxx |
High:11101101 1010wwww 10yyyyyy (CD) (A0-AF) (80-BF) Low: 11101101 1011yyxx 10xxxxxx (CD) (B0-BF) (80-BF) |
U+0000~U+FFFF をそのまま16ビットで表現します。U+10000~U+10FFFF の文字は サロゲートペア を用いて表します。
範囲 | ビット数 | 変換元ビット | 変換後ビット |
---|---|---|---|
U+0000~U+FFFF | 16bits | yyyyyyyy xxxxxxxx | yyyyyyyy xxxxxxxx (00-FF) (00-FF) |
U+10000~U+10FFFF | 21bits | zzzzz yyyyyyyy xxxxxxxx ↓ (wwww = zzzzz-1) High:110110ww wwyyyyyy Low: 110111yy xxxxxxxx |
High:110110ww wwyyyyyy (D8-DB) (00-FF) Low: 110111yy xxxxxxxx (DC-DF) (00-FF) |
Unicodeで定義されるすべての文字を32ビットで表現します。メモリ効率がよくないためあまり使用されていません。
範囲 | ビット数 | 変換元ビット | 変換後ビット |
---|---|---|---|
U+0000~U+FFFF | 16bits | yyyyyyyy xxxxxxxx | 00000000 00000000 yyyyyyyy xxxxxxxx (00) (00) (00-FF) (00-FF) |
U+10000~U+10FFFF | 21bits | zzzzz yyyyyyyy xxxxxxxx | 00000000 000zzzzz yyyyyyyy xxxxxxxx (00) (00-10) (00-FF) (00-FF) |
Unicode が 16ビットから 21ビットに拡張されたことに伴い U+10000~U+10FFFF の文字を表現する必要が生じました。UTF-32 であれば表すことができますが、UTF-16 ではビット数が足りません。そこで、21ビットを前半と後半の2つの領域に分け、1文字目を U+D800~U+DBFF、2文字目を U+DC00~U+DFFF の2文字で表す方式が採用されました。この2文字のペアを サロゲートペア と呼びます。
例えば魚の 「𩸽(ほっけ:U+29E3D)」 という文字は、次のように変換します。
U+29E3D → 00010 10011110 00111101 // 29E3Dを21ビットの2進数に変換 → 0001 10011110 00111101 // zzzzzから1引いて4ビットにする → [110110] 0001 100111 [110111]10 00111101 // 110110ww wwyyyyyy 110111yy xxxxxxxx 形式にする → 1101 1000 0110 0111 1101 1110 0011 1101 // 4ビット毎に整形 → D867 DC3D // 16進数に変換 → U+D867 U+DE3D // 2文字分のコードで𩸽(U+29E3D)を表す
これにより、U+10000~U+10FFFF 領域の文字に対応していないプログラムでも、この領域の文字を U+0000~U+FFFF 領域の文字として扱うことが可能となります。ただし、文字数をカウントする際に1文字を2文字とカウントしたり、区切ってはならない箇所で区切ったりなどの問題は発生します。
16ビットや32ビットの値をファイルやネットワークに書き出す際に、上位バイトから書き出す方式(ビッグエンディアン)と下位バイトから書き出す方式(リトルエンディアン)があります。例えば「あ(U+3042)」を UTF-16 で符号化し、ビッグエンディアンで書き出すと 0x30 0x42 の順序となりますが、リトルエンディアンで書き出すと 0x42 0x30 の順序となります。ネットワークでは通常ビッグエンディアンが使用されます。ファイルでは Windows 系が x86系CPU が効率的に扱えるリトルエンディアンを使用していることから、リトルエンディアンが主流となっています。UTF-8 の場合はバイトオーダーの概念はありません。
UTF-16 や UTF-32 のバイトオーダーを示すために、ファイルの先頭にオプションとして付加する、U+FFFE (ZERO WIDTH NO-BREAK SPACE) 文字に相当する数バイトのデータです。
符号化方式 | BOMの有無 | エンディアン | BOM | 備考 |
---|---|---|---|---|
UTF-8 | 省略可 | - | 0xEF 0xBB 0xBF | UTF-8 にはエンディアンの概念が無いがつけることがある。 |
UTF-8N | 無し | - | BOM無しの UTF-8 を UTF-8N と呼ぶ。 | |
UTF-16 | 省略可 | BE | 0xFE 0xFF | 省略時はビッグエンディアン推奨。 |
LE | 0xFF 0xFE | |||
UTF-16BE | 無し | BE | 利用者間で予め合意しておく。 | |
UTF-16LE | 無し | LE | 利用者間で予め合意しておく。 | |
UTF-32 | 省略可 | BE | 0x00 0x00 0xFE 0xFF | 省略時はビッグエンディアン推奨。 |
LE | 0xFF 0xFE 0x00 0x00 | |||
UTF-32BE | 無し | BE | 利用者間で予め合意しておく。 | |
UTF-32LE | 無し | LE | 利用者間で予め合意しておく。 |
「Julius Cæsar」の「æ」(U+00E6) の様に「a」と「e」など、複数の文字が組み合わさって1つの文字として表記されるものを 合字(ligature) と呼びます。
æ U+00E6 Œ U+0152
「平成」を「㍻」、「アパート」を「㌀」と表記するように、複数の文字を表現上1文字で表すものを 組文字 と呼びます。
㍻ U+337B ㌀ U+3300
下記の「ガ」と「ガ」は同じ文字に見えますが、上段は「ガ(U+30AC)」の1文字なのに対し、下段は「カ(U+30AB)」と「゙ (U+3099)」を組み合わせた文字になっています。「カ」+「゙ 」→「ガ」の変換を合成(composition)、「ガ」→「カ」+「゙ 」の変換を分解(decomposition)と呼びます。「カ」の様に合字の対象となる文字を基底文字(base character)、「゙ 」の様に補足する文字を結合文字(combining character)、合成された文字を合成済み文字(combining character)と呼びます。
ガ U+30AC ガ U+30AB U+3099
下記なども結合の例です。
ǖ U+01D6 ǖ U+00FC U+0304 ǖ U+0075 U+0308 U+0304
合字と呼ぶのか結合文字と呼ぶのか分かりませんが、「😵(U+1F635)」と「💫(U+1F4AB)」を「Zero Width Joiner(U+200D)」と呼ばれる特殊文字で連結すると、下記の様に新たな表情の絵文字を表示できるようです。(Windows 11 以降で表示)
😵💫 U+1F635 U+1F4AB 😵💫 U+1F635 U+200D U+1F4AB
意味は同じだけど表記が少し異なる文字があります。「鬼滅の刃」 の 「竈門禰󠄀豆子」 の 「禰󠄀(部首がネ)」 は文字としては登録されておらず、「禰(部首が示)」 の 異体字(variant) として扱われます。異体字は、元の文字に 異体字セレクタ(variation Selector) と呼ばれる U+180B~U+180D(3個)、U+FE00~U+FE0F(16個)、U+E0100~U+E01EF(240個) を付加して表します。
禰 U+79B0 禰󠄀 U+79B0 U+E0100 葛 U+845B 葛󠄀 U+845B U+E0100
絵文字にもいくつか絵文字修飾子(emoji modifier)と呼ばれるものが用意されており、例えば下記の絵文字などは絵文字修飾子で肌の色を変更することができます。
👦 U+1F466 👦🏽 U+1F466 U+1F3FD 👦🏿 U+1F466 U+1F3FF
「ガ(U+30AC)」 と合字の 「ガ(U+30AB U+3099)」 を比較したり、全角の 「カ(U+30AB)」 と半角の 「カ(U+FF76)」 を区別なく比較したい時、正規化(normalization) を行います。正準等価変換 では 「ガ(U+30AC)」 と合字の 「ガ(U+30AB U+3099)」 の様に見栄えが同じ状態で変換します。互換等価変換 では 「カ(半角)」 を 「カ(全角)」、「1(全角)」 や 「①」 を 「1(半角)」、「㌀」 を 「アパート」 に変換するなど、見栄えも変わる不可逆変換を行います。厳密比較を行いたいときは NFC で、あいまい比較を行いたいときは NFKC で変換してから比較するとよいでしょう。JavaScript では normalize()、Python では unicodedata.normalize() で変換できます。
NFD (Normalization Form Canonical Decomposition) 正準等価で分解 ガ(U+304C) → ガ(U+30AB U+3099) ガ(U+30AB U+3099) → ガ(U+30AB U+3099) ガ(U+FF76 U+FF9E) → ガ(U+FF76 U+FF9E) NFC (Normalization Form Canonical Composition) 正準等価で分解後に正準等価で合成 ガ(U+304C) → ガ(U+304C) ガ(U+30AB U+3099) → ガ(U+304C) ガ(U+FF76 U+FF9E) → ガ(U+FF76 U+FF9E) NFKD (Normalization Form Compatibility Decomposition) 互換等価で分解 ガ(U+304C) → ガ(U+30AB U+3099) ガ(U+30AB U+3099) → ガ(U+30AB U+3099) ガ(U+FF76 U+FF9E) → ガ(U+30AB U+3099) NFKC (Normalization Form Compatibility Composition) 互換等価で分解後に正準等価で合成 ガ(U+304C) → ガ(U+304C) ガ(U+30AB U+3099) → ガ(U+304C) ガ(U+FF76 U+FF9E) → ガ(U+304C)