MBCS。Multi Byte Character Setの略だ。
読んで字のごとく、1つの文字を複数バイトで表すキャラクタセットのこと。
ちょっと待て、キャラクタセット?
キャラクタセットって「文字集合」だろう。文字集合って、符号化方式とは別だよな。
まぁ、両者を一緒に規定する「符号化文字集合」ってのもあるみたいだけど(今はじめて知った)。
簡単に違いを挙げておこう。
たとえば、「ひらがな」はひらがなの集合だから文字集合だ。
しかし、ひらがなの1文字を何バイトで表すかということを、「ひらがな」は規定しない。
これを規定するのは、符号化方式、つまりISO-2022-JPだったりShift-JISだったりUTF-8だったり。
Unicodeについて言えば、UCS-2とかUCS-4の「CS」はCharacter Setの略だから文字集合(UCSは「Universal multi-octet coded Character Set」の略なので符号化文字集合)。
UTF-8とかUTF-16ってのが符号化方式だ。
さて、先にも述べたように、MBCS(あるいは、より限定してDBCS)というのがある。
キャラクタセットがバイト数を規定しようとしている時点でおかしいのだが、ここではMBCSは「1文字を複数バイトで表す符号化方式」と解釈しよう。文字集合の全てが符号化文字集合ではないのでね。
ここではさらに「バイト」の定義にも言及しなければならない。
「1バイト」とは何ビットのことか? 8ビット? いや違う。
1バイトとは「処理場都合のいいビット数」と言ってよく、事実、1バイトが6ビットとか7ビットのマシンもあった。
ちなみに、正確に8ビットを表現したいときは「1オクテット」と言う。
では、UTF-16はどうだろう?
サロゲートペアの問題はあるとは言え、基本的には一律1文字16ビットの符号化方法である。
ということは、この場合は「1バイト=16ビット」と言ってよいのではないだろうか。
MBCSの対義語はSBCS(Single Byte Character Set)だが、だとすると、UTF-16はSBCSか?
Win32 APIには、MBCSとワイド文字との変換を行うWideCharToMultiByte、MultiByteToWideCharという2つの関数がある。
ここで、MBCS側のコードページを指定する引数に、UTF-7とUTF-8を指定することが可能だ。
UTF-7やUTF-8はUTF-16とは違い、1文字に割り当てられたビット数はまちまちなので、これらはMBCSと呼んでいいだろう。
これらの関数は、UTF-16をMBCSとは扱わない。
ここではじめて出てきた「ワイド文字」という言葉についても、一応言及しておこう。
Windowsにおいては、「ワイド文字」とはUTF-16で表された文字のことである。
ただし、例えばC言語の規格書では、必ずしもそうとは規定されていない(Cの規格書は、とかく「処理系定義」が多い…)。
C言語における「ワイド文字型」の定義は、大雑把に言えば「処理系がサポートする全ての文字を区別できるコード範囲を保持できる整数型」である(正確な定義は規格書を当たっていただきたい)。
よって、例えばASCIIコードしかサポートしないコンパイラであれば、ワイド文字=ASCII文字でも構わない。
なお、Visual C++では、Windows同様、ワイド文字=UTF-16である。
MBCSというものの定義を、どこかが厳密に定めているのかどうかは知らない。個人的には慣用的な言葉ではないかと思う。
だが、こうして追い求めてみると、なかなか面白いかも知れない。