この
記事 きじ には
複数 ふくすう の問題 もんだい があります。
改善 かいぜん や
ノートページ での
議論 ぎろん にご
協力 きょうりょく ください。
マルチバイト文字 もじ (マルチバイトもじ)とは、コンピュータ 上 うえ で
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 )といい、以下 いか のようなものがある。
なお、2バイト文字 もじ 集合 しゅうごう の文字 もじ のことを2バイト文字 もじ と呼 よ ぶことがある。しかし、1バイト文字 もじ 集合 しゅうごう の文字 もじ であっても、EUC-JP におけるJIS X 0201カタカナなどのように、符号 ふごう 化 か 方式 ほうしき によっては一見 いっけん 1文字 もじ あたり2バイトであるかのような符号 ふごう 化 か をされることがある。また近年 きんねん [いつ? ] では、Unicode で処理 しょり することも多 おお い。そのため、文字 もじ 集合 しゅうごう でなく個々 ここ の文字 もじ を指 さ して1バイト文字 もじ ・2バイト文字 もじ と表現 ひょうげん することは、混乱 こんらん を招 まね くことがある。
符号 ふごう 化 か 方式 ほうしき におけるマルチバイト文字 もじ
編集 へんしゅう
シングルバイト文字 もじ との対比 たいひ
編集 へんしゅう
符号 ふごう 化 か 方式 ほうしき において、1文字 もじ が常 つね に1バイトとなる符号 ふごう 化 か 方式 ほうしき [注釈 ちゅうしゃく 1] に対 たい して、1文字 もじ が2バイト以上 いじょう になることのある符号 ふごう 化 か 方式 ほうしき 、およびそれによって符号 ふごう 化 か された文字 もじ (列 れつ )のことを、マルチバイト文字 もじ (列 れつ )という。
実際 じっさい には、ほぼ例外 れいがい なく ASCII あるいは ISO 646 をベースとし、バイト値 ち 80 - FF16進 しん 法 ほう (あるいはそのサブセット)で始 はじ まるバイト列 れつ によりそれ以外 いがい の文字 もじ 集合 しゅうごう を表現 ひょうげん する。
1文字 もじ のバイト数 すう が可変 かへん のため、プログラムでの操作 そうさ に留意 りゅうい を要 よう する。
符号 ふごう 化 か 方式 ほうしき であるから厳密 げんみつ には character set (文字 もじ 集合 しゅうごう ) と呼 よ ぶのは不正 ふせい 確 かく だが、とくにIBM やマイクロソフト の用語 ようご として、single-byte character set (単 たん バイト文字 もじ 集合 しゅうごう )、double-byte character set (2バイト文字 もじ 集合 しゅうごう )、multibyte character set (多 た バイト文字 もじ 集合 しゅうごう )と呼 よ ぶことが多 おお い。
以下 いか のようなものがある。
ワイド文字 もじ との対比 たいひ
編集 へんしゅう
C言語 げんご の規格 きかく において、char
型 かた 以上 いじょう のサイズを持 も つwchar_t
型 かた を利用 りよう したワイド文字 もじ (列 れつ )に対 たい して、char
型 かた を利用 りよう して1文字 もじ あたり1バイト以上 いじょう の可変長 かへんちょう のバイト列 れつ として表 あらわ したものをマルチバイト文字 もじ (列 れつ )という。ワイド文字 もじ に対 たい する用語 ようご のため、1文字 もじ をもっぱら1バイトで表 あらわ すシングルバイト文字 もじ であっても、この意味 いみ ではマルチバイト文字 もじ に含 ふく まれる。
ワイド文字 もじ を内部 ないぶ 処理 しょり に用 もち いるプラットフォームもある。ワイド文字 もじ のサイズが2バイトあるいは4バイトの場合 ばあい 、本来 ほんらい 1文字 もじ ごとに1バイトで収 おさ まるはずのASCII範囲 はんい の文字 もじ にも2バイトあるいは4バイトを費 つい やすことになり、少 すく なくともASCII範囲 はんい に関 かん してはメモリ効率 こうりつ は劣 おと ることになるが、処理 しょり 対象 たいしょう のデータ中 ちゅう にマルチバイト文字 もじ で表現 ひょうげん すると2バイト以上 いじょう を費 つい やすような文字 もじ が多数 たすう 出現 しゅつげん する場合 ばあい は、ワイド文字 もじ を利用 りよう したほうが処理 しょり 効率 こうりつ もメモリ効率 こうりつ も高 たか くなることがある。
ワイド文字 もじ およびマルチバイト文字 もじ の具体 ぐたい 的 てき な表現 ひょうげん は環境 かんきょう 依存 いぞん であり規格 きかく には定 さだ めがない。これらは、実在 じつざい する具体 ぐたい 的 てき な文字 もじ 集合 しゅうごう や符号 ふごう 化 か 方式 ほうしき を分類 ぶんるい する用語 ようご ではなく、固定 こてい 長 ちょう か可変長 かへんちょう かという概念 がいねん を定義 ていぎ した用語 ようご である。そのため、何 なに がワイド文字 もじ で何 なに がマルチバイト文字 もじ かという考 かんが え方 かた ではなく、ワイド文字 もじ の表現 ひょうげん として何 なに を使 つか い、マルチバイト文字 もじ の表現 ひょうげん として何 なに を使 つか うか、という考 かんが え方 かた をとる。ワイド文字 もじ としては、近年 きんねん [いつ? ] では Unicode が使 つか われることが多 おお い。マルチバイト文字 もじ の符号 ふごう 化 か 方式 ほうしき はロケール に依存 いぞん するが、ほとんどの場合 ばあい は ASCII あるいは ISO 646 をベースにしたものとなり、日本語 にほんご ロケールであれば一般 いっぱん 的 てき に Shift_JIS や EUC-JP になる。UTF-8 が用 もち いられる場合 ばあい もある。
ワイド文字 もじ は当初 とうしょ 、文字 もじ 集合 しゅうごう におけるすべての文字 もじ を等 ひと しいサイズのデータで一様 いちよう に処理 しょり できるようにすることを想定 そうてい していた。しかし、Unicode においてサロゲートペア 、結合 けつごう 文字 もじ 、異体 いたい 字 じ セレクタ といった拡張 かくちょう 概念 がいねん が採用 さいよう されたことにより、UTF-16 やUTF-32 といった符号 ふごう 化 か 方式 ほうしき のデータをワイド文字 もじ に格納 かくのう する場合 ばあい 、たとえワイド文字 もじ が16ビットあるいは32ビットのサイズを持 も っていたとしても、1つのワイド文字 もじ だけでは表現 ひょうげん できないUnicode文字 もじ も現 あらわ れるようになった。文字 もじ 境界 きょうかい の判定 はんてい や文字数 もじすう のカウントなど、プログラム上 じょう での扱 あつか いはマルチバイト文字 もじ と同様 どうよう に注意 ちゅうい を要 よう する。
C言語 げんご (C95 以降 いこう )では、マルチバイト文字 もじ (列 れつ )の操作 そうさ のために以下 いか のような関数 かんすう が規定 きてい されている。ただし、特 とく に日本語 にほんご のような2バイト文字 もじ 集合 しゅうごう を含 ふく むロケールでは、実装 じっそう が不十分 ふじゅうぶん で実用 じつよう に耐 た えない場合 ばあい も多 おお い。
mblen
mbtowc
wctomb
mbstowcs
wcstombs
Microsoft Windows では、ワイド文字 もじ が2バイト(16ビット)として定義 ていぎ されており、符号 ふごう 化 か 方式 ほうしき にUTF-16を利用 りよう する。多 おお くのWindows API には、入出力 にゅうしゅつりょく インターフェイスとして、システムロケール設定 せってい に依存 いぞん するマルチバイト文字 もじ セットを利用 りよう する関数 かんすう ・構造 こうぞう 体 たい (シンボル末尾 まつび にA
が付 つ けられている)と、Unicode文字 もじ セットを利用 りよう する関数 かんすう ・構造 こうぞう 体 たい (シンボル末尾 まつび にW
が付 つ けられている)の両方 りょうほう が用意 ようい されており、ヘッダーファイルをインクルードする際 さい に_UNICODE
シンボルの定義 ていぎ 有無 うむ [1] でマルチバイト文字 もじ セット/Unicode文字 もじ セットを切 き り替 か えることのできるプリプロセッサマクロも用意 ようい されているが、マルチバイト文字 もじ セット用 よう のAPIはWindows 9x系 けい 向 む けに書 か かれたコードとの互換 ごかん 性 せい のために残 のこ されているものであり、またWindows NT系 けい では内部 ないぶ 処理 しょり にUTF-16を使用 しよう しているため、マルチバイト文字 もじ セット用 よう のAPIを使用 しよう すると変換 へんかん のための余計 よけい なオーバーヘッドが増 ふ える。Microsoft Visual C++ はバージョン7.1 (2003) まではマルチバイト文字 もじ セットが既定 きてい 値 ち だったが、バージョン8.0 (2005) 以降 いこう はUnicode文字 もじ セットが既定 きてい 値 ち となった。マルチバイト文字 もじ 列 れつ の操作 そうさ や、ワイド文字 もじ 列 れつ との相互 そうご 変換 へんかん のために以下 いか のようなAPI関数 かんすう が提供 ていきょう されている。
MultiByteToWideChar
WideCharToMultiByte
CharNextA
CharPrevA
シンボル末尾 まつび にA
が付 つ けられたマルチバイト文字 もじ セット用 よう API関数 かんすう は、コードページ番号 ばんごう を明示 めいじ 的 てき に指定 してい できず、動作 どうさ はシステムロケール設定 せってい に依存 いぞん する。
近年 きんねん [いつ? ] 、符号 ふごう 化 か 文字 もじ 集合 しゅうごう としての 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 などを使 つか う場合 ばあい とがある。