文字符号化方式

文字符号化方式（もじふごうかほうしき、、CES）とは、符号化文字集合で文字に対応付けた非負整数値を、実際にコンピュータが利用できるデータ列（通常、バイト列）に変換する符号化方式。
文字符号化体系、文字符号化スキーム () とも言う。文字について述べていることが明確なときは、単に符号化方式、またIBMの用語ではコード化体系 () などとも言う。
この用語はUnicodeやIETFの標準などで用いているが、ISO/IECやJISの標準では用いず「符号化文字集合の構造」あるいは「文字符号の構造及び拡張法」として扱われている。この用語の定義は、世界の文字コード規格とは必ずしも合致しないことがある。
符号化文字集合と文字符号化方式.
符号化文字集合とCESの関係を示すため、JIS X 0208を例にとる。なお、話を簡単にするため、附属書は無視する。
JIS X 0208は、符号化文字集合であり、文字の表と、各文字に対応付けられた1区1点～94区94点の番号（区点）と、それに対応したビット組合せからなる。例えば、「亜」という漢字の区点番号は16区1点であり、対応するビット組合せは x0110000 x0100001 の2バイトである (xは呼出し先がGLであれば0、GRであれば1)。こうした符号化文字集合について、他の符号化文字集合と組み合わせたり、計算によって変形したりする方式を、文字符号化方式 (CES) と呼ぶことがある。また、特定の符号化文字集合とCESとの組み合わせによって実現する文字列の表現を符号化表現と呼ぶことがある (符号化表現はキャラクタセットとほぼ同義である)。
1つの符号化文字集合に適用できるCESが複数ある場合、符号化表現も1つではない。JIS X 0208の場合、主要なものとして、ISO-2022-JP (RFC1468符号化表現)・EUC-JP・Shift_JISがある。
ISO-2022-JPは、JIS X 0208の文字に対応付けた1～94の区点を、それぞれ2116～7E16の範囲の1バイト、計2バイトで表す。さらに、エスケープ・シーケンスを使い、ASCIIやJIS X 0201など別の文字集合に切り替えることができる。このように、1つのCESが使う符号化文字集合は、1つとは限らない。
ほとんどの場合、ISO-2022-JPのように符号化文字集合とバイト列の対応は単純であるが、常にそうだとは限らない。Shift_JISでは、JIS X 0208文字集合を、複雑な計算式により、2バイトで表現できる000016～FFFF16のうちJIS X 0201と競合しない長方形の領域に詰め込んでいる。
文字符号化形式と文字符号化スキーム.
Unicodeでは、文字符号化スキーム () を、文字符号化形式 () と、バイト直列化等の2つの段階に分けて標準化している。
Unicodeでは、Unicode符号化文字集合のU+0000〜U+10FFFFの各符号位置に、Unicodeスカラ値という非負整数値を対応付けている。CEFは、このUnicodeスカラ値を符号単位列に変換する。UnicodeのCEFには、UTF-8・UTF-16・UTF-32があり、これらが使う符号単位はそれぞれ、符号なし8ビット整数・符号なし16ビット整数・符号なし32ビット整数である。これらの文字符号化形式はプログラムにおける文字の内部表現として実装される。
しかし、情報交換のためファイルの読み書きや通信を行う場合には、符号単位列をバイト列にする必要があり、8ビット以外の符号単位列をバイト列にするには、バイト順序（エンディアン）を決める必要がある。そのためCESでは、CEFに加え、バイト直列化の手続きを決める、つまり、エンディアンを指定するかまたはエンディアンを記述する方法を規格化している。（各CESのバイト直列化の具体的な内容については、UTF-16#符号化を参照）
Unicodeで定められたCEFとCESは、表のものがある（ただし、Unicode技術標準でSCSU (UTS 6) が、Unicode技術報告でUTF-EBCDIC (UTR 16) とCESU-8 (UTR 26) が、Unicode技術ノートでBOCU-1 (UTN 6) が、その他、ISO/IEC標準やRFCで、Unicode文字集合を使ったCEFやCESを規格化している）。同じ名称のCEFとCESがあり、これらを区別するときは、「UTF-16符号化形式」「UTF-16符号化スキーム」のように呼ぶ。一般にUTF-16と呼ばれるものは、UTF-16符号化形式に対応する3つのCESの総称である。なお、UTF-8符号化形式とUTF-8符号化スキームは実質的に同じものだが、便宜上、分けている。
Unicode以外でも、原理的にはCEFとCESを区別して論ずることができる。しかし、ほとんどの場合8ビット整数を符号単位とするため、UTF-8の場合と同様に区別する意味は少ない。たとえば、Shift_JISの文字データを扱うプログラムは、8ビット整数を符号単位とするマルチバイト文字の文字データの処理を行っているため、ファイルの読み書きや通信などでバイト直列化処理をあらためて行うことはない。