マルチバイト文字

マルチバイト文字とは



マルチバイト文字とは、コンピュータ上で文字を表現する際に、1文字を複数のバイトで表す体系、またはそのような体系で表される文字のことを指します。しかし、文脈によってその意味合いは異なります。

文字集合におけるマルチバイト文字

文字集合の観点では、ISO 2022の体系において、1文字が1バイトで表現される文字集合(シングルバイト文字集合)に対し、1文字が2バイト以上で表現される文字集合をマルチバイト文字集合と呼びます。具体的には、2バイト文字集合(94×94文字集合、96×96文字集合など)や、3バイト文字集合(94×94×94文字集合など)があります。特に2バイト文字集合は、GB 2312、JIS X 0208JIS X 0212JIS 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-8UTF-16などの符号化方式があります。Unicodeは、1バイト=1オクテットと定義すれば、マルチバイト文字集合とみなすことができます。しかし、1バイト文字集合とマルチバイト文字集合という分類は、「1バイト文字集合を基本としてマルチバイト文字集合を導入する」という前提に基づいているため、単一文字集合であるUnicodeを採用する時点では、この前提が崩れています。

符号化方式としては、UTF-8はマルチバイト符号化方式と言えますが、UTF-16ASCII互換でないため、考慮されないことが多いです。ワイド文字としては、UTF-16やUTF-32を使い、マルチバイト文字としては、UTF-8や従来のShift_JISを使用する場合があります。

まとめ



マルチバイト文字は、文字を表現する上で重要な概念です。文字集合、符号化方式、C言語における扱いなど、多岐にわたる側面を理解することで、より正確な文字処理が可能になります。Unicodeの普及とともに、マルチバイト文字の概念は変化しつつありますが、その基本を理解することは依然として重要です。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。