マルチバイト文字とは
マルチバイト
文字とは、
コンピュータ上で
文字を表現する際に、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の普及とともに、マルチバイト
文字の概念は変化しつつありますが、その基本を理解することは依然として重要です。