マルチバイト文字
マルチバイト文字(マルチバイトもじ)とは、
- 1文字を複数バイトで表す体系
- 1文字のバイト数が可変であるような体系
- そのような体系で表される文字
を指すが、文脈により意味合いが異なる。
文字集合におけるマルチバイト文字
ISO 2022の体系を前提とした図形文字集合において、1文字が1バイトの文字集合[1]に対して、1文字が2バイト以上の文字集合を、マルチバイト文字集合[2]という。94×94文字集合(2バイト)、96×96文字集合(2バイト)、94×94×94文字集合(3バイト)などがこれに該当するが、実際には94×94文字集合以外はまれである。
特に、1文字が2バイトの文字集合を2バイト文字集合[3]といい、以下のようなものがある。
- GB 2312
- JIS X 0208(JIS C 6226)
- JIS X 0212
- JIS X 0213
- KS X 1001(KS C 5601)
- KPS 9566
- CNS 11643
なお、2バイト文字集合の文字のことを2バイト文字と呼ぶことがある。しかし、1バイト文字集合の文字であっても、EUC-JPにおけるJIS X 0201カタカナなどのように、符号化方式によっては一見1文字あたり2バイトであるかのような符号化をされることがある。また近年では、Unicode で処理することも多い。そのため、文字集合でなく個々の文字を指して1バイト文字・2バイト文字と表現することは、混乱を招くことがある。
符号化方式におけるマルチバイト文字
シングルバイト文字との対比
符号化方式において、1文字が常に1バイトとなる符号化方式[4]に対して、1文字が2バイト以上になることのある符号化方式、およびそれによって符号化された文字(列)のことを、マルチバイト文字(列)という。
実際には、ほぼ例外なく ASCII あるいは ISO 646 をベースとし、でバイト値 80~FF16進法(あるいはそのサブセット)で始まるバイト列によりそれ以外の文字集合を表現する。 1文字のバイト数が可変のため、プログラムでの操作に留意を要する。
符号化方式であるから厳密には character set(文字集合) と呼ぶのは不正確だが、とくにIBMやマイクロソフトの用語として、single-byte character set(単バイト文字集合)、double-byte character set(二バイト文字集合)、multibyte character set(多バイト文字集合)と呼ぶことが多い。
以下のようなものがある。
- Shift_JIS(コードページ932/942)
- EUC-JP
- ISO-2022-JP
- EUC-CN(コードページ936)
- EUC-KR(コードページ949)
- Big5(コードページ950)
- UTF-8(サロゲートペアによる多バイト符号化方式)
ワイド文字との対比
C言語の規格において、すべての文字を等しいサイズのデータ(wchar_t
)で表すワイド文字(列)に対して、1文字あたり1バイト以上の可変長のバイト列として表したものをマルチバイト文字(列)という。ワイド文字に対する用語のため、1文字をもっぱら1バイトで表すシングルバイト文字であっても、この意味ではマルチバイト文字に含まれる。
ワイド文字は内部処理用、マルチバイト文字は入出力用と位置づけられており、マルチバイト文字で入力されたデータを、処理の容易なワイド文字に変換して処理し、結果をマルチバイト文字に変換して出力することが想定されている。
ワイド文字およびマルチバイト文字の具体的な表現は環境依存であり規格には定めがない。これらは、実在する具体的な文字集合や符号化方式を分類する用語ではなく、固定長か可変長かという概念を定義した用語である。そのため、何がワイド文字で何がマルチバイト文字かという考え方ではなく、ワイド文字の表現として何を使い、マルチバイト文字の表現として何を使うか、という考え方をとる。ワイド文字としては、近年では Unicode が使われることが多い。マルチバイト文字の符号化方式はロケールに依存するが、ほとんどの場合は ASCII あるいは ISO 646 をベースにしたものとなり、日本語ロケールであれば一般的に Shift_JISや EUC-JP になる。UTF-8 が用いられる場合もある。
C言語では、マルチバイト文字(列)の操作のために以下のような関数が規定されている。ただし、特に日本語のような2バイト文字集合を含むロケールでは、実装が不十分で実用に耐えない場合も多い。
mblen
mbtowc
wctomb
mbstowcs
wcstombs
Windows のアプリケーション開発では、APIや文字定数の内部表現をワイド文字とマルチバイト文字のどちらにするかを切り替えることができる。また、マルチバイト文字列の操作のために以下のような関数が提供されている。
MultiByteToWideChar
WideCharToMultiByte
CharNext
CharPrev
Unicode
近年、符号化文字集合としての ISO 10646(Unicode)、およびその符号化方式(UTF-8、UTF-16など)が広く使われている。
文字集合としての ISO 10646 は、1バイト=1オクテット(8ビット)と定義すれば、一応マルチバイト文字集合ということはできる。しかし、現実的には、1バイト文字集合とマルチバイト文字集合という分類の前提となっているのは、「1バイト文字集合(ASCII、ISO 646)を基本としつつマルチバイト文字集合を導入する」という命題であり、単一文字集合である Unicode を採用する時点でこの前提自体が崩れている。
符号化方式としては、シングルバイトの符号化方式と対比した場合、UTF-8 などはマルチバイトの符号化方式といえる。UTF-16 などは ASCII 互換でないため考慮されないことが多い。また、ワイド文字の文脈では、一般にワイド文字としては UTF-16 や UTF-32 を使い、マルチバイト文字としては、UTF-8 などを使う場合と、従来の Shift_JIS などを使う場合とがある。
脚注
- ↑ テンプレート:Lang-en-short、94文字集合または96文字集合
- ↑ テンプレート:Lang-en-short
- ↑ テンプレート:Lang-en-short
- ↑ ISO 8859/1、Windowsコードページ1252、Macintosh Roman など