Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2023年07月16日] [更新 2025年11月02日]* Delphi 一般・その他 [未分類 - OS の操作等]
文字符号化方式・文字コード・コードページ・コードポイント
動作確認等 Windows 10 ビルド 19043 Pro 64 bit
[整理番号 - 1930]







文字符号化方式・文字コード・コードページ・コードポイント


本ページは,表題の用語についての簡単な説明記事です.





01_コンピュータにおける文字の符号化


コンピュータでは,文字そのものを記憶したり保存することはできません.文字に数値 (番号) を割り当てて,その値を記憶したり保存したりしています.文字を画面に表示したり印刷する時は,文字に割れ当てた値に相当する文字の描画データを,フォントファイルから読み出して,図形としての文字を描画します.
文字に数値を割り当てて,各々の文字を識別することを符号化と言います.

文字の符号化は,コンピュータメーカがそれぞれ独自の符号化の方式で行ってきました.その結果,いくつもの文字符号化方式が存在することになりました.

日本では,1978年に JIS が文字符号化集合としての規格を制定しています.現在の JIS X 0208 がその規格です.この規格制定後,日本語の文字符号化方式は,この規格の文字を基本として符号化されています.





02_文字符号化方式と文字集合 ( 文字セット )


日本語の文字符号化方式は,以下の JIS X 0208 の文字が基本となっています.この規格の文字以外に,各符号化方式が独自に文字を追加しています.
各々の文字符号化方式で使用可能な文字全体を,符号化文字集合,あるいは,符号化文字セットと言います.単に文字集合,文字セットと言うこともあります.



Windows では,マイクロソフトが策定した文字符号化方式を,ANSI (米国国家規格協会) が制定した方式が使用されてきました.ANSI の規格では,国と地域によって文字符号化方式が異なります.
日本語版の Windows では,ANSI が制定した Shift_JIS と呼ばれる文字符号化方式が使用されてきました.これは,JIS X 0208 で制定されている文字に,半角カタカナと約 400 文字を追加した内容になっています.
以下は,Windows の Shift_JIS の文字集合です.つまり,Shift_JIS で使用可能な文字の集まり (セット) ということになります.



文字を使用する立場としては,文字符号化方式 (文字の割り当て) の具体的な内容を知る必要はないと思いますが,以下のリンクに Shift_JIS についての説明記事があります.この記事の表で,Windows-31J が Windows の Shift_JIS です.1993  年リリースの Windows 3.1 の日本語版で実装されたのでこの名前になっています.



[備考]
Shift_JIS という用語は,IANA (Internet Assigned Numbers Authority - インターネット番号割当機関) が定義して使用してきた用語です.JIS の規格名にも規格文書にも使用されていませんでしたが,2000年発行の,JIS X 0208 規格文書の付属書 Shift_JISX0213 で,Shift_JIS の名称が定義されています.




03_文字コード・コードページ・コードポイント


コンピュータ関連のシステムベンダは,識別子を付けて文字符号化方式を区別しています.この識別子をコードページと言います.各コードページにおいて,つまり,文字の符号化によって,個々の文字に割り当てられた値をコードポイントと言います.

コードポイントは,符号点,符号化点,文字コードと言うこともあります.
以下の最初のリンクは,Windows で使用可能なコードページの一覧です.つまり,Windows で使用可能な文字符号化方式の一覧です.Shift_JIS のコードページは 932 です.コードページの識別子であることを明確にするには,プリフィックスの CP を付けて CP932 と表記します.




文字コードと言う用語は,コードポイントの意味ですが,文字符号化方式の意味で使われていることがあります.例えば,テキストファイルの場合,



「このテキストファイル (テキスト) の文字コードは Shift_JIS です」



という言い方をすることがあります.もちろん,実際にディスクに保存されているのは「テキスト (文字)」ではなく,文字コード (コードポイント) の値です.
個別の文字コードについては以下のような表現があります.



「文字コードが Shift_JIS の時,文字 東 の文字コードは 938C です」
「文符号化方式が Shift_JIS の時,文字 東 の文字コードは 938C です」
「コードページが 932 の時,文字 東 のコードポイントは 938C です」



使用可能な文字は文字符号化方式によって決まります.これを「使用可能な文字は文字コードによって決まります」と言った場合,この「文字コード」が文字符号化方式のことを意味するのか,コードポイントのことを意味するのか,判断に迷います.



文字符号化方式を意味する時は,文字コードという用語ではなく,文字符号化方式という用語を使用した方が確実で無難と言えます.例えば,文字符号化方式による文字コードの違いを説明する場合も,「文字符号化方式」を使用した方が明確と言えます.




下表は,文字コードの違いによる文字「東」の文字コードの違いです.
下表は,文字符号化方式の違いによる文字「東」の文字コードの違いです.
下表は,文字符号化方式の違いによる文字「東」のコードポイントの違いです.



文字 コードポイント (文字コード)
ISO-2022-JP EUC-JP Shift_JIS UTF-16 UTF-8
456C C5EC 938C 6771 E6 9D B1


「文字符号化方式」は character encoding scheme の和訳です.このことから,エンコードの方式,あるいは単にエンコード (encode) という用語も,文字の符号化方式の意味で使用することがあります.文字コードを,別の符号化方式の文字コードに変換する処理もエンコードと言います.
encode は,情報の暗号化,記号化,符号化など,別の形式に変換するという意味です.その逆は decode (デコード) と言います.文字の符号化の場合,デコードの概念はありません.



[備考 1]
上の表の 938C, 6771 (16 進数) などが文字「東」の値です.これが文字コードとしてのコンピュータ内部のデータです.この値がメモリに書き込まれたり,ディスクに保存されます.文字に割れ当てる値と文字の対応関係の方式,つまり,文字符号化方式によって文字コードが異なります.

[備考 2]
コンピュータ内部のデータは 16 進数を使用して表示します.16 進数の 1 桁は,10 進数で 0 ~ 15 です.16 進数では,これを 1 桁で表示するために,10 進数の 10 ~ 15 に相当する値としてアルファベットの A ~ F を使用します.

[備考 3]
「コードポイント」という用語に馴染みがない方が多いようです.そこで,当サイトの記事では「文字コード」という用語を多用しています.




04_Unicode ( ユニコード )


言語に依存せず,プログラムにも依存せず,OS などのプラットフォームにも依存しない,全ての文字に固有の番号を割り当てることを目的でユニコードコンソーシアム (The Unicode Consortium) が 1990年12月に設立されました.ユニコードコンソーシアムが策定・改訂した内容は,ISO(国際標準化機構),IEC(国際電気標準会議)が規格として制定しています.ユニコードコンソーシアムが策定した文字符号化方式のことを Unicode (ユニコード) と呼んでいます.uni は「単一の,唯一の」という意味です.

1993年に UCS-2 として 34,233 字が制定されました.UCS-2 には,世界で一般的に使用される文字,記号類が登録されました.UCS-2 は,1 文字に 2 バイト使用します.その後,より多くの文字が扱えるように,UCS-2 を改定して,UTF-8, UTF-16, UTF-32 が制定されました.
どれも Unicode ですが,単に Unicode と言う時は UTF-16 のことを意味します.UTF-16 であることを明確にする場合は,コードポイントに U+ のプリフィックスを付けます.例えば,文字「東」のコードポイントは U+6771 と書きます.



文字符号化方式 使用バイト数
UTF-8 1 バイト (8 ビット) 単位の可変長バイト
UTF-16 UCS-2 で定義された文字は 2 バイト (16 ビット)
それ以外は 4 バイト以上の可変長バイト
UTF-32 4 バイト (32 ビット) の固定長バイト


Unicode に登録されている文字は,ユニコードコンソーシアムが公開している以下の PDF で閲覧することができます.Unicode Standard 15.0.0 にば,149,186 文字が登録されています.
この最初のリンクの PDF は,2 番目のリンクのディレクトリ 15.0.0/charts/ 内の CodeCharts.pdf です.



例えば文字「東」のコードポイントは U+6771 です.これは下図のように登録されています.




図1
U+6771 の登録内容

コードポイントの下の表示は部首情報です.「東」は「木 (きへん)」の文字です.75.4 の 75 は部首番号で,4 は部首内の画数です.
漢字の下の表示は原典情報です.下表のようになっています.この文字が制定されている規格名とその文字コードになっています.TCA は,台北市コンピュータ協会の略称です.TCVN は Viet Nam Standards (Tieu Chuan Viet Nam) の略です.
「東」の簡体字は「东」です.



原典の分類 原典の規格と文字コード (16 進数)
G1 中国 GB12345-90 : 362B.(繁体字) 
HB1 中国 (台湾) Big-5, Level 1 : AA46 (繁体字)
T1 中国 (台湾) TCA-CNS 11643-1992 第1面 : 4E29
J0 日本 JIS X 0208-1990 : 456C.456C は JIS コード
K0 韓国 KSX 1001:2004 : 5454
V1 ベトナム TCVN 6056 : 5945


以下は,文字「東」の個別情報です.kIRG_JSource に原典情報関係の記述があります.表の最後には中国の簡体字のコードポイントが書かれています.ページの最後には,グリフウィキ (GlyphWiki) の文字「東」へのリンクがあります.


[備考 1]
UCS-2 の UCS は,Universal multi-octet Character Set (国際符号化文字集合) の略です.UCS-2 は,2011年の改定で廃止されました.
UTF は,Unicode Transformation Format (ユニコード変換形式) の略です.

[備考 2]
Windows は,2000年にリリースされた Windows 2000 で Unicode による処理が可能になりました.2006年にリリースされた Windows Vista で全面的に Unicode 化されました.

[備考 3]
2 バイトは 16 進数で FFFF です.つまり 16 ビットです.16 ビットで扱える数値は 0 - 65,535 です.2 バイトだけでは,これ以上の文字は扱えないことになります.
Windows ては (少なくても Windows 10 までは),フォントファイル内の文字のインデックスに 2 バイトを使用しています.そのため,Windows  のフォントファイルには,65,535 を超える文字は収録できません.






05_Unicode Standard 以外の文字


漢字の異体字セレクタを使用する異体字は,Unicode Standard とは別に登録されています.以下は,異体字セレクタを使用する異体字関係の記事や資料へのリンクです.
2023年現在,日本の漢字としては,異体字セレクタを使用する異体字には,以下の 3, 4, 5 番目の 3 つのコレクションがあります.この 3, 4, 5 番目の PDF は,2 番目のリンクのディレクトリ [2022-09-13/] 内にある PDF です.

IVS は,異体字セレクタを使用する仕組みである Ideographic Variation Sequence (表意文字異体字シーケンス) の略称ですが,通常は,異体字セレク VS (Variation Selector) の具体的な値の意味で使われています.
したがって,異体字セレクタを使用する文字は UCS + IVS (基底文字 + 異体字セレクタの値) という構造になります.



No. リンク 内容
1 Ideographic Variation Database 表意文字異体字データベース (IVD) についての説明
2 Index of _ivd_data 異体字のバージョンインデックス
3 Adobe-Japan1 collection (PDF) Adobe が策定した異体字
4 Hanyo-Denshi collection (PDF) 汎用電子情報交換環境整備プログラムが策定した異体字
5 Moji_Joho collection (PDF) 文字情報技術促進協議会が策定した異体字


Adobe-Japan1 collection の異体字は,Adobe-Japan1 に登録されている文字の一部です.Adobe-Japan1 は,Adobe が独自に符号化した文字セットです.Adobe-Japan1 は,DTP (Desktop publishing) におけるデファクトスタンダードとにっています.

Adobe-Japan1 collection のグリフは,Windows 10 に標準でインストールされる游明朝フォント / 游ゴシックフォントに収録されいます.下図は,游明朝フォントを使用した Adobe-Japan1 collection の異体字の例です.




図2
Adobe-Japan1 collection の異体字の例

  • フォントは游明朝
  • 基底文字は U+9089
  • 異体字セレクタ (IVS) の値は
    E0100 - E010E

Hanyo-Denshi collection のグリフは,花園明朝フォントに収録されています. このフォントは,以下のリンクのページで,HanaMinA.otf, HanaMinB.otf, HanaMinC.otf の 3 つをクリックしてダウンロードできます.
花園明朝フォントには,Adobe-Japan1 collection の異体字も収録されています.
下図は,花園明朝A を使用した異体字の表示例です.




図3
Hanyo-Denshi collection の異体字の例

  • フォントは花園明朝A
  • 基底文字は U+9089
  • 異体字セレクタ (IVS) の値は
    E010F - E011E

Moji_Joho collection のグリフは,文字情報技術促進協議会が提供している IPAmj明朝フォントに収録されています.このフォントは,以下の最初のリンクからダウンロードできます.また,IPAmj明朝フォントに収録されている漢字の情報がエクセルのブックで提供されています.以下の 2 番路のリンクからダウンロードできます.




図4
Moji_Joho collection の異体字の例

  • フォントはIPAmj明朝
  • 基底文字は U+9089
  • 異体字セレクタ (IVS) の値は
    E010F - E011D, E011F

上で説明しているのは IVS と呼ばれている異体字セレクタを使用する異体字です.異体字セレクタには,以下のような種類があります.


名称 異体字セレクタ
Ideographic Variation Sequence
略称 IVS
漢字専用
U+E0100 ~ U+E01EF
(240 個)
Standardized Variation Sequence
略称 SVS
非漢字や CJK 互換漢字用
U+FE00 ~ U+FE0F
(16 個)
Mongolian Free Variation Selector
モンゴル自由字形選択子
U+180B ~ U+180D
(3 個)


Emoji も,Unicode Emoji として登録されています.Emoji 用のフォントは,OS のベンダやサードパーティが提供していて,それぞれデザインに違いがあります.Unicode Emoji には PDF の資料はありません.全てテキストベースの資料となっています.以下の最初の記事にユニコードコンソーシアムが公開している資料へのリンクがあります.


[備考]
ユニコードコンソーシアムが公開している PDF にはフォントが埋め込まれています.したがって,閲覧する環境の違いによる文字化けはありません.
ただし,異体字関係の PDF の文字はコピーできません.文書内の文字の検索もできません.各々の文字には Unicode の基底文字のコードポイントが併記されています.このコードポイントで文字を検索できます.




06_メモ帳でテキストを保存する時の [ 文字コード ] と BOM


Windows 10 に付属のメモ帳では,テキストを保存する時に文字符号化方式を指定できます.下図は [ファイル] [名前を付けて保存] で現われる保存ダイアログの右下の部分です.[文字コード] が文字符号化方式の設定です.デフォルトは UTF-8 です.




図5
メモ帳の保存ダイアログ


UTF-16 には UTF-16 LE と UTF-16 BE があります.バイトデータが,実際に保存されたデータです.バイナリデータとも言います.

UTF-16 LE で保存すると,先頭に 0xFFFE が追加されてその後に各文字のコードポイントの値が続きますが,コードポイントの上位バイトと下位バイトが入れ替わっています.この状態を Little Endian (リトルエンディアン) と言います.
UTF-16 BE で保存すると,先頭に 0xFEFF が追加されてその後に各文字のコードポイントの値がそのまま続きます.この状態を Big Endian (ビッグエンディアン) と言います.
エンディアンは,このバイトオーダ (バイト順) を識別する用語です.先頭の 2 バイトはバイトオーダマーク (Byte Order Mark) と呼ばれていて,この値でエンディアンを判定します.どちらで保存しても,Intel 系の CPU のコンピュータではリトルエンディアンにして処理します.現在,多くのパソコンには Intel 系の CPU が使われていますから,UTF-16 LE で保存すれば良いと思われます.

「A」のコードポイントは U+0041 です.「東」のコードポイントは U+6771 です.



[文字コード] エンディアン 保存テキスト
(メモ帳の表示)
バイトデータ (保存されたデータ)
 赤の下線部分が BOM
UTF-16 LE Little Endian A東 FFFE 4100 7167
UTF-16 BE Big Endian FEFF 0041 6771


UTF-8 には UTF-8 と UTF-8 (BOM 付き) があります.バイトデータが,実際に保存されたデータです.UTF-8 は bOM なしとも言います.
EFBBBF が BOM に相当する値ですが,BOM があってもなくてもコードポイントのバイトオーダは同じです.UTF-8 の場合,BOM はバイトオーダの判定に使われているわけではありません.



[文字コード] 保存テキスト
(メモ帳の表示)
バイトデータ (保存されたデータ)
赤の下線部分が BOM
UTF-8 A東 41 E6 9D B1
UTF-8 (BOM 付き) EFBBBF 41 E6 9D B1


下表は英数字だけを保存した結果です.123 は「数字」であって「数値」ではありません.数値の場合はバイトデータが異なります.

ANSI は,英語圏の場合は ASCII です.日本語環境の場合は Shift_JIS です.ANSI の場合も UTF-8 の場合はも保存されたバイトデータは全く同じになっています.これでは両者の区別が付きません.UTF-8 で保存する時に UTF-8 (BOM 付き) で保存すれば ANSI と UTF-8 の判定ができます.つまり,UTF-8 の BOM は,バイトオーダの識別用ではなく (BOM としての機能ではなく),実際には UTF-8 であるかの判定用としてz使われていることになります.



[文字コード] 保存テキスト
(メモ帳の表示)
バイトデータ (保存されたデータ)
ANSI ABCD123 41 42 43 44 31 32 33
UTF-8 41 42 43 44 31 32 33


UTF-16 のファイルには必ず BOM があります.UTF-8 のファイルには BOM 付きと BOM なしがありますが,利用するアプリが必ずしも BOM の存在をチェックして処理してくれるとは限りません.このことが問題となるのは,主にプログラミングの世界でのことです.



[備考]
Unix 系の OS, OS X のシステムの文字符号化方式は UTF-8 です.Windows 10 は UTF-16 ですが,Intel 系の CPU のコンピュータの場合は UTF-16 LE, それ以外の場合は UTF-16 BE です.
Microsoft Word / Excel などは UTF-8 を使用しています.