MCMDが扱う漢字等のマルチバイト文字は基本的にはUTF-8を前提としている。 SHIFT_JIS等、異なるエンコーディングによるマルチバイト文字でも運用は可能であるが、一部の機能は正しく動作しないであろう。 以下ではマルチバイト文字の扱いについてのMCMDでの処理方式について説明する。
MCMDでは処理速度を重視する観点から、漢字コードはマルチバイト文字のまま扱っているために、 エンコーディングによっては、文字列検索や置換の処理で思わぬ結果がもたらされることがある。 例えば、SHIFT_JISで「陰」は0x8941であるが、これは2バイト目がシングルバイト文字の「A」にあたる。 そのため「陰」に対して「A」を「B」に置換する処理を付すと「隠」(0x8942)に変換されてしまう。 UTF-8ではこのような問題が起こらないようなコード体系を採用している。 さらにマルチバイト文字とASCII文字が混在した文字列において文字数をカウントすることは、 たとえUTF-8であろうと非常に困難である。
このような問題を避ける最良の方法は、ASCIIコードも含めて全ての文字を固定長に変換してしまうことである。 これがワイド文字と呼ばれるものである(MCMDでは32bit固定長を採用)。 ワイド文字への変換には、マルチバイト文字のエンコーディング方式が分かっている必要がある。 変換プログラムは、環境変数LANGに設定された値によって、その方式を識別している。 環境変数は以下のように確認すればよい。
$ echo $LANG ja_JP.UTF-8
MCMDの中の一部のコマンドは、データ処理に先立ち入力データを全てワイド文字に変換してから処理するオプション(-W)が提供されている。 対応しているコマンド一覧をTable 2.3に示す。 これらのコマンドは検索もしくは置換の機能であり、エンコーディングがUTF-8であれば利用する必要はない。
コマンド名 |
機能 |
説明 |
mchgstr |
置換 |
-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。 |
mselstr |
検索 |
部分文字列マッチング(-sub)を行う場合、 |
-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。 |
||
msed |
置換 |
-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。 |
mtonull |
検索 |
部分文字列マッチング(-sub)を行う場合、 |
-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。 |
また、mcal、mselについてはワイド文字を扱う関数が用意されている(Table 2.4)。 これらの中で、lengthwなどの文字数をカウントしたり文字位置を計算する関数においては、 エンコーディングがUTF-8であっても利用する必要がある。
関数名 |
機能 |
説明 |
lengthw |
文字数 |
対象文字列を処理前にワイド文字に変換する。 |
midw |
部分文字列 |
〃 |
rightw |
部分文字列 |
〃 |
leftw |
部分文字列 |
〃 |
regexsw |
正規表現マッチ |
〃 |
regexmw |
正規表現マッチ |
〃 |
regexrepw |
正規表現置換 |
〃 |
regexlenw |
正規表現マッチ長 |
〃 |
regexposw |
正規表現マッチ位置 |
〃 |
regexstrw |
正規表現マッチ部分文字列 |
〃 |
regexpfxw |
正規表現マッチプレフィックス |
〃 |
regexsfxw |
正規表現マッチサフィックス |
〃 |
その他、ワイド文字の扱いについては、以下の点に注意されたい。
ワイド文字への変換オーバーヘッドがかかるため処理速度は犠牲になる。
項目名については例外なくワイド文字に変換して処理を行っているために問題とはならない。
ファイル名はマルチバイト文字のまま扱っている。