Previous: データ本体がない場合の動作 Up: Mコマンド Next: パラメータ指定 MCMD2
MCMD2 : Mコマンド : マルチバイト文字

2.8 マルチバイト文字

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であれば利用する必要はない。

Table 2.3: ワイド文字への変換処理機能を持つコマンド一覧

コマンド名

機能

説明

mchgstr

置換

-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。

mselstr

検索

部分文字列マッチング(-sub)を行う場合、

   

-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。

msed

置換

-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。

mtonull

検索

部分文字列マッチング(-sub)を行う場合、

   

-Wを指定することでf=で指定した項目データは内部でワイド文字に変換される。

また、mcal、mselについてはワイド文字を扱う関数が用意されている(Table 2.4)。 これらの中で、lengthwなどの文字数をカウントしたり文字位置を計算する関数においては、 エンコーディングがUTF-8であっても利用する必要がある。

Table 2.4: ワイド文字への変換処理機能を持つmcal関数一覧

関数名

機能

説明

lengthw

文字数

対象文字列を処理前にワイド文字に変換する。

midw

部分文字列

〃

rightw

部分文字列

〃

leftw

部分文字列

〃

regexsw

正規表現マッチ

〃

regexmw

正規表現マッチ

〃

regexrepw

正規表現置換

〃

regexlenw

正規表現マッチ長

〃

regexposw

正規表現マッチ位置

〃

regexstrw

正規表現マッチ部分文字列

〃

regexpfxw

正規表現マッチプレフィックス

〃

regexsfxw

正規表現マッチサフィックス

〃

その他、ワイド文字の扱いについては、以下の点に注意されたい。

  • ワイド文字への変換オーバーヘッドがかかるため処理速度は犠牲になる。

  • 項目名については例外なくワイド文字に変換して処理を行っているために問題とはならない。

  • ファイル名はマルチバイト文字のまま扱っている。

Previous: データ本体がない場合の動作 Up: Mコマンド Next: パラメータ指定 MCMD2