マルチバイト文字とは
マルチバイト
文字とは、
コンピュータ上で
文字を表現する際に、1
文字を複数のバイトで表す体系、またはそのような体系で表される
文字のことを指します。しかし、文脈によってその意味合いは異なります。
文字集合におけるマルチバイト文字
文字集合の観点では、ISO 2022の体系において、1
文字が1バイトで表現される
文字集合(シングルバイト
文字集合)に対し、1
文字が2バイト以上で表現される
文字集合をマルチバイト
文字集合と呼びます。具体的には、2バイト
文字集合(94×94
文字集合、96×96
文字集合など)や、3バイト
文字集合(94×94×94
文字集合など)があります。特に2バイト
文字集合は、
GB 2312、
JIS X 0208、
JIS X 0212、
JIS X 0213、
KS X 1001、KPS 9566、
CNS 11643などが該当します。
2バイト
文字集合の
文字は2バイト
文字と呼ばれることがありますが、符号化方式によっては1バイト
文字が2バイトで表現されることもあり、注意が必要です。近年では
Unicodeで処理することも多いため、
文字集合でなく個々の
文字を指して1バイト
文字、2バイト
文字と表現することは混乱を招く可能性があります。
符号化方式におけるマルチバイト文字
符号化方式の観点では、1
文字が常に1バイトで表現される符号化方式(シングルバイト符号化方式)に対し、1
文字が2バイト以上になる可能性がある符号化方式や、それによって符号化された
文字(列)をマルチバイト
文字(列)と呼びます。多くのマルチバイト符号化方式は、
ASCIIまたはISO 646をベースとし、特定のバイト値で始まるバイト列で、他の
文字集合を表現します。可変長のバイト数で表現されるため、プログラムでの操作には注意が必要です。
符号化方式であるため、厳密には「
文字集合」と呼ぶのは不正確ですが、特に
IBMや
マイクロソフトの用語として、シングルバイト
文字集合、2バイト
文字集合、多バイト
文字集合と呼ばれることがあります。具体的な例として、
Big5、EUC-CN、
EUC-JP、EUC-KR、
ISO-2022-JP、Shift_JIS、
UTF-8などがあります。
ワイド文字との対比
C言語では、`char`型よりもサイズの大きい`wchar_t`型を利用したワイド
文字に対し、`char`型を利用して可変長のバイト列で表現されたものをマルチバイト
文字と呼びます。この意味では、1
文字を1バイトで表すシングルバイト
文字もマルチバイト
文字に含まれます。ワイド
文字は内部処理に用いられることがあり、固定長のバイト数で表現されるため、
ASCII範囲の
文字も2バイトまたは4バイトを使用する場合があります。
ワイド
文字とマルチバイト
文字の具体的な表現は環境に依存し、規格で定められていません。これらは、固定長か可変長かという概念を定義した用語です。近年のワイド
文字には
Unicodeが用いられることが多く、マルチバイト
文字はロケールに依存し、Shift_JISや
EUC-JPが使われることが多いです。
UTF-8が使用されることもあります。
ワイド
文字は当初、すべての
文字を等しいサイズのデータで処理することを想定していましたが、
Unicodeの拡張概念(サロゲートペア、結合
文字、
異体字セレクタなど)により、ワイド
文字でも表現できない
文字が現れるようになりました。プログラム上での扱いは、マルチバイト
文字と同様に注意を要します。
C言語では、マルチバイト
文字(列)を操作するための関数が規定されていますが、日本語のような2バイト
文字集合を含むロケールでは、実装が不十分な場合があります。
Microsoft Windowsにおけるマルチバイト文字
Windowsでは、ワイド
文字は2バイト(16ビット)で定義され、
UTF-16が使用されます。
Windows APIには、マルチバイト
文字セット(シンボル末尾にA)と
Unicode文字セット(シンボル末尾にW)の両方が用意されています。マルチバイト
文字セットは
Windows 9x系との互換性のために残されていますが、内部処理は
UTF-16を使用するため、マルチバイト
文字セットを使用するとオーバーヘッドが増えます。
Microsoft Visual C++では、バージョン8.0以降は
Unicode文字セットが既定値です。
Windowsでは、マルチバイト
文字列の操作や、ワイド
文字列との相互変換のために、`MultiByteToWideChar`、`WideCharToMultiByte`などのAPI関数が提供されています。マルチバイト
文字セット用APIはコードページ番号を明示的に指定できず、システムロケール設定に依存します。
Unicode
近年、ISO 10646(
Unicode)が広く使われており、
UTF-8や
UTF-16などの符号化方式があります。
Unicodeは、1バイト=1オクテットと定義すれば、マルチバイト
文字集合とみなすことができます。しかし、1バイト
文字集合とマルチバイト
文字集合という分類は、「1バイト
文字集合を基本としてマルチバイト
文字集合を導入する」という前提に基づいているため、単一
文字集合である
Unicodeを採用する時点では、この前提が崩れています。
符号化方式としては、
UTF-8はマルチバイト符号化方式と言えますが、
UTF-16は
ASCII互換でないため、考慮されないことが多いです。ワイド
文字としては、
UTF-16や
UTF-32を使い、マルチバイト
文字としては、
UTF-8や従来のShift_JISを使用する場合があります。
まとめ
マルチバイト
文字は、
文字を表現する上で重要な概念です。
文字集合、符号化方式、
C言語における扱いなど、多岐にわたる側面を理解することで、より正確な
文字処理が可能になります。
Unicodeの普及とともに、マルチバイト
文字の概念は変化しつつありますが、その基本を理解することは依然として重要です。