とほほの文字コード入門

目次

文字コードとは

「文字コード」とは、文字をコンピューターで表現する際にどのようなバイト表現にするかを定めるもので、下記の概念を持ちます。

用語 説明
文字集合 符号化文字集合(CCS:Coded Character Set)、キャラクタセット とも呼びます。文字に番号を割り振ります。主な文字集合として JIS X 0208Unicode があります。これらの規約では、文字に「群・面・区・点」の番号を割り振ります。群は 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_JISEUC など、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ビットで表現。

関連用語:

文字集合

ASCII

American Standard Code for Information Interchangeの略です。1963年に米国のASA(現在のANSI)が制定した 7ビット文字集合です。0x00~0x7F のバイトコードの中に 33文字の制御文字と、95文字の半角英数記号文字を定義しています。まだ文字集合と符号化方式という概念が生まれる前の文字コード体系です。最初は小文字の定義もなく、制御文字も異なっていましたが、1967年の改定でほぼ現在の定義になりました。


上位4ビット
01234567





0NULDLESP0@P`p
1SOHDC1!1AQaq
2STXDC2"2BRbr
3ETXDC3#3CScs
4EOTDC4$4DTdt
5ENQNAK%5EUeu
6ACKSYN&6FVfv
7BELETB'7GWgw
8BSCAN(8HXhx
9HTEM)9IYiy
ALFSUB*:JZjz
BVTESC+;K[k{
CFFFS,<L\l|
DCRGS-=M]m}
ESORS.>N^n~
FSIUS/?O_oDEL

下記の版があります。

ISO/IEC 646 (ASCIIの国際規格版)

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ビット
01234567





0NULDLESP0@P`p
1SOHDC1!1AQaq
2STXDC2"2BRbr
3ETXDC3#3CScs
4EOTDC4$4DTdt
5ENQNAK%5EUeu
6ACKSYN&6FVfv
7BELETB'7GWgw
8BSCAN(8HXhx
9HTEM)9IYiy
ALFSUB*:JZjz
BVTESC+;K[k{
CFFFS,<L\l|
DCRGS-=M]m}
ESORS.>N^n~
FSIUS/?O_oDEL

下記の版があります。

JIS X 0201 (半角英数・半角カナ)

ISO/IEC 646 を日本向けにカスタマイズし、1969年に日本工業規格(JIS) が制定しました。制定当時は JIS C 6220 でしたが、JIS の情緒部門(X)設立に伴い、JIS X 0201(ローマ字/半角カナ文字) に名称変更されました。ASCII とは、5/12 のバックスラッシュ(\)が円記号(¥)に、7/14 のチルダ(~)がオーバーライン(‾)になっている点が異なります。また、8ビット空間を用いて半角カナ文字も定義しています。


上位4ビット
01234567 89ABCDEF





0NULDLESP0@P`p
1SOHDC1!1AQaq
2STXDC2"2BRbr
3ETXDC3#3CScs
4EOTDC4$4DTdt
5ENQNAK%5EUeu
6ACKSYN&6FVfv
7BELETB'7GWgw
8BSCAN(8HXhx
9HTEM)9IYiy
ALFSUB*:JZjz
BVTESC+;K[k{
CFFIS4,<L¥l|
DCRIS3-=M]m}
ESOIS2.>N^n
FSIIS1/?O_oDEL ソ

下記の版があります。

ISO-8859 (欧州系8ビット文字)

ISO/IEC 646 ではカスタマイズできる文字数が少なすぎたため、欧州を中心に独自に制定した 8ビットコード体系です。

規格説明
ISO-8859-1Latin-1 西欧諸語。英語、ドイツ、フランス、イタリア、スペイン、ポルトガル、オランダ、デンマーク、アイスランド、アイルランド、ノルウェー、スウェーデン語など。
ISO-8859-2Latin-2 中央欧諸語。ボスニア、ポーランド、クロアチア、チェコ、スロバキア、スロベニア、ハンガリー語など。
ISO-8859-3Latin-3 南欧諸語。トルコ、マルタ、エスペラント語など。
ISO-8859-4Latin-4 北欧諸語。エストニア、ラトビア、リトアニア、グリーンランド語など。
ISO-8859-5Cyrillic キリル文字。ロシア、ベラルーシ、ブルガリア、マケドニア、セルビア、ウクライナ語など。
ISO-8859-6Arabic アラビア語
ISO-8859-7Greek ギリシャ語
ISO-8859-8Hebrew ヘブライ語
ISO-8859-9Latin-5 トルコ語
ISO-8859-10Latin-6 北欧語
ISO-8859-11タイ語。
ISO-8859-12予約
ISO-8859-13Latin-7 Baltic Rim。
ISO-8859-14Latin-8 Celtic。
ISO-8859-15Latin-9 Latin-1の改定
ISO-8859-16Latin-10 Latin-2の改定

ISO/IEC 6429:1992 (制御文字)

C0領域(0x00~0x1F)、C1領域(0x80~0x9F) の制御文字を定義します。

上位4ビット
012...789





0NULDLE...-DCS
1SOHDC1...-PU1
2STXDC2...BPHPU2
3ETXDC3...NBHSTS
4EOTDC4...-CCH
5ENQNAK...NELMW
6ACKSYN...SSASPA
7BELETB...ESAEPA
8BSCAN...HTSSOS
9HTEM...HTJ-
ALFSUB...VTSSCI
BVTESC...PLDCSI
CFFIS4...PLUST
DCRIS3...RIOSC
ESOIS2...SS2PM
FSIIS1...DELSS3APC

下記の版があります。

JIS X 0211 (制御文字)

ISO/IEC 6429 とほぼ同等内容の JIS 規格です。

下記の版があります。

JIS X 0208 (第一水準・第二水準漢字)

平仮名、片仮名、漢字などの日本語の文字コードを定義します。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 0212 (補助漢字)

JIS X 0208 に足りない文字を追加したもので、特殊文字(21字)、アルファベット(245字)、補助漢字(5,801字)、合計(6,067字)を定義しています。1990年に制定されましたが、Shift_JIS との相性が悪くあまり使用されていません。

下記の版があります。

JIS X 0213 (第三水準・第四水準漢字)

JIS X 0212 の代わりに 2000年に制定されました。JIS X 0208(第1面) の空き領域に第三水準漢字を、また、第2面に第四水準漢字を定義しました。

下記の文字が定義されています。

下記の版があります。

文字数は下記の様に変化しています。

規格俗称非漢字第一水準第二水準第三水準第四水準合計
JIS C 6226-1978JIS78、78JIS、旧JIS453字2,965字3,384字6,802字
JIS C 6226-1983JIS83、83JIS、新JIS524字3,388字6,877字
JIS X-0208-1983
JIS X 0208-1990JIS90、90JIS3,390字6,879字
JIS X 0208-1997JIS97、97JIS
JIS X 0213-2000JIS2000、2000JIS1,183字1,249字2,436字11,223字
JIS X 0213-2004JIS2004、2004JIS1,259字11,233字

符号化方式

ISO-2022-JP (JISコード)

電子メール等で利用される符号化方式です。俗にいう「JISコード」。JIS X 0211 の制御文字、JIS X 0201 のローマ字、JIS X 0208 の文字をバイト列に符号化します。ESC(0x1B) で始まるエスケープシーケンスで、その後に続く文字集合を指定します。全角文字は、区番号、点番号にそれぞれ 0x20 を足します。すべてのバイトが 0x00~0x7F の範囲に収まります。

ABC(漢字)(ASCII)XYZ
4142431B 24 4224 2224 2424 261B 28 4258595A

エスケープシーケンスには下記などがあります。

規格記号表記16進表記意味
ISO-2022-JPESC ( B1B 28 42ASCII。
ESC ( J1B 28 4AJIS X 6220(JIS X 0201)-1976 ラテン文字集合
ESC $ @1B 24 40JIS C 6226(JIS X 0208)-1978(通称:旧JIS)
ESC $ B1B 24 42JIS X 0208-1983(通称:新JIS) または JIS X 0208-1990
ISO-2022-JP-1 で追加ESC $ ( D1B 24 28 44JIS X 0212-1990(JIS補助漢字)
ISO-2022-JP-2 で追加ESC $ A1B 24 41GB 2312-80(中国語)
ESC $ ( C1B 24 28 43KS X 1001-1992(韓国語)
ESC . A1B 2E 41ISO/IEC 8859-1 の右半分
ESC . F1B 2E 46ISO/IEC 8859-7 の右半分
ISO-2022-JP-3 で追加ESC $ ( O1B 24 28 4FJIS X 0213:2000の1面
ESC $ ( P1B 24 28 50JIS X 0213:2000の2面
ISO-2022-JP-2004ESC $ ( Q1B 24 28 51JIS X 0213:2004の1面
ISO-IR 013ESC ( I1B 28 49JIS X 0201(半角カナ) ... 一部のソフトでのみ利用

ISO-2022-JP に類似した符号化方式には下記などがあります。

規格説明
CP50220Microsoft による規格。ISO-2022-JP の Windows-31J版。半角カナを JIS X 0208 の全角カナに変換して表します。
CP50221CP50220 と類似していますが、半角カナを ESC ( I でエスケープして表します。
CP50222CP50220 と類似していますが、SO(0x0E)で半角カナの始まり、SI(0x0F)で終わりを示します。
ISO-2022-JP-MSLinux陣営が規定した独自規格。半角カナは ESC ( I、外字を ESC $ ( ? でエスケープします。

EUC-JP (EUC)

Extended UNIX Code Packed Format for Japanese の略。UNIX/Linix 系のシステムで使用される符号化方式です。ASCIIJIS X 0208(漢字)、JIS X 0201(半角カナ) を扱います。漢字は区点番号に 0xA0 を足すと EUC となります。例えば、「あ」(4区2点)は、0x04 0x02 + 0xA0 0xA0 = 0xA4 0xA2 で「あ」となります。半角カナは SS2(0x8E) を付加します。

ABC
414243A4 A2A4 A4A4 A68E B18E B28E B3

Shift_JIS (シフトJIS)

Windows 系で使用される符号化方式です。JIS X 0208 の付属書で「シフト符号化表現」という名称で定義されています。半角文字(制御文字・英数記号・半角カナ)は JIS X 0201 の文字をそのまま使用し、全角文字は、1バイト目を JIS X 0201 で未使用の 0x81~0x9F、0xE0~0xEF、2バイト目を 0x40~0x7E、0x80~0xFC の領域に計算式でシフトして符号化します。

ABC
41424382 A082 A282 A4B1B2B3

文字の割り当ては次のようになります。

1バイト目2バイト目説明
0x00~0x1F制御文字
0x20~0x7E英数記号文字
0x7F制御文字(DEL)
0x81~0x9F0x40~0x7E, 0x80~0xFCJIS X 0213(1面:前半)
0xA1~0xDF半角カナ
0xE0~0xEF0x40~0x7E, 0x80~0xFCJIS X 0213(1面:後半)
0xF0~0xFC0x40~0x7E, 0x80~0xFCJIS 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_JISX0213JIS X 0213 に対応したもの。
Shift_JIS-2004JIS X 0213:2004 の改定に対応したもの。

JIS系コードマップ

JIS系文字集合のそれぞれの符号化方式によるマッピングは次のようになります。

Unicode

世界中の文字を一つのコード体系で表現しようとして制定されたものです。日本で定義された文字も取り込まれていますが、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」の様に表したりします。

UTF-8

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)

UTF-16

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)

UTF-32

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 の場合はバイトオーダーの概念はありません。

BOM(バイトオーダーマーク)

UTF-16 や UTF-32 のバイトオーダーを示すために、ファイルの先頭にオプションとして付加する、U+FFFE (ZERO WIDTH NO-BREAK SPACE) 文字に相当する数バイトのデータです。

符号化方式BOMの有無エンディアンBOM備考
UTF-8省略可0xEF 0xBB 0xBFUTF-8 にはエンディアンの概念が無いがつけることがある。
UTF-8N無しBOM無しの UTF-8 を UTF-8N と呼ぶ。
UTF-16省略可BE0xFE 0xFF省略時はビッグエンディアン推奨。
LE0xFF 0xFE
UTF-16BE無しBE利用者間で予め合意しておく。
UTF-16LE無しLE利用者間で予め合意しておく。
UTF-32省略可BE0x00 0x00 0xFE 0xFF省略時はビッグエンディアン推奨。
LE0xFF 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)