マルチバイト文字
出典: フリー百科事典『ウィキペディア(Wikipedia)』
マルチバイト文字とは、
- 1文字を複数バイトで表す体系
- 1文字のバイト数が可変であるような体系
- そのような体系で表される文字
を指すが、文脈により意味合いが異なる。
目次 |
[編集] 文字集合におけるマルチバイト文字
ISO 2022の体系を前提とした図形文字集合において、1文字が1バイトの文字集合(Single Byte Character Set、94文字集合または96文字集合)に対して、1文字が2バイト以上の文字集合を、マルチバイト文字集合 (Multibyte Character Set) という。 94×94文字集合(2バイト)、96×96文字集合(2バイト)、94×94×94文字集合(3バイト)などがこれに該当するが、実際には94×94文字集合以外はまれである。
とくに、1文字が2バイトの文字集合を2バイト文字集合 (Double Byte Character Set) といい、以下のようなものがある。
- JIS X 0208 (JIS C 6226)
- JIS X 0212
- JIS X 0213
- GB 2312
- KS X 1001 (KS C 5601)
- CNS 11643
なお、2バイト文字集合の文字のことを2バイト文字と呼ぶことがある。 しかし、1バイト文字集合の文字であっても、符号化方式によっては一見1文字あたり2バイトであるかのような符号化をされることがある(例: EUC-JPにおけるJIS X 0201カタカナ)。 また近年では、Unicodeで処理することも多い。 そのため、文字集合でなく個々の文字を指して1バイト文字・2バイト文字と表現することは、混乱を招くことがある。
[編集] 符号化方式におけるマルチバイト文字
[編集] シングルバイト文字との対比
符号化方式において、1文字が常に1バイトとなる符号化方式(ISO 8859/1、Windowsコードページ1252、Macintosh Romanなど)に対して、1文字が2バイト以上になることのある符号化方式、およびそれによって符号化された文字(列)のことを、マルチバイト文字(列)という。
実際には、ほぼ例外なくASCIIあるいはISO 646をベースとし、バイト値0x80~0xFF(あるいはそのサブセット)で始まるバイト列によりそれ以外の文字集合を表現する。 1文字のバイト数が可変であるため、プログラムでの操作に注意が必要である。
符号化方式であるから厳密にはcharacter setと呼ぶのは不正確だが、とくにIBMやマイクロソフトの用語として、Single Byte Character Set (SBCS)、Double Byte Character Set (DBCS)、Multibyte Character Set (MBCS)と呼ぶことが多い。
以下のようなものがある。
- 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/Unicodeは、1バイト=1オクテット(8ビット)と定義すれば、一応マルチバイト文字集合ということはできる。しかし、現実的には、1バイト文字集合とマルチバイト文字集合という分類の前提となっているのは、「1バイト文字集合 (ASCII/ISO 646) を基本としつつマルチバイト文字集合を導入する」という命題であり、単一文字集合であるUnicodeを採用する時点でこの前提自体が崩れていることに注意が必要である。
符号化方式としては、シングルバイトの符号化方式と対比した場合、UTF-8などはマルチバイトの符号化方式といえる。UTF-16などはASCII互換でないため考慮されないことが多い。 また、ワイド文字の文脈では、一般にワイド文字としてはUTF-16やUTF-32を使い、マルチバイト文字としては、UTF-8などを使う場合と、従来のShift_JISなどを使う場合とがある。