BBS-BBS/28

トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

gawk とマルチバイト文字と正規表現 - hi_saito (2006年01月28日 21時12分35秒)

個人の Blog からの移行 (誘導) です。

gawkとマルチバイト文字と正規表現に以下のようなことが書かれていました。

たとえばen_us.UTF-8 なんてのはa A b B c C d D ...のような順序に
なり、[a-z]にはZを除く大文字も含まれることになる (ときどきメー
リングリストにバグ報告として流れてますな)。で、日本語版Windows
で調べたところ、日本語ロカールでは a a A A b b B B c c C 
C d d D D... のように順序付けられていることが判明。

Debian GNU/Linux sarge で試す

abcdefg
ABCDEFG
abcdefg
ABCDEFG

というファイルを、UTF-8 (test-utf8.txt), EUC-JP (test-euc.txt), SJIS (test-sjis.txt) で用意。

これを

$ LANG=ja_JP.eucJP gawk '/[a-z]/' test-euc.txt
abcdefg
$ LANG=ja_JP.UTF-8 gawk '/[a-z]/' test-utf8.txt
abcdefg
$ LANG=ja_JP.SJIS gawk '/[a-z]/' test-sjis.txt
abcdefg

としたが、結果は上のようになりません。

LC_ALL を設定しても同じ結果でした。

alnum でも調べました

ja_JP.eucJP で

$ gawk '/[[:alnum:]]/' test-euc.txt
abcdefg
ABCDEFG
abcdefg
ABCDEFG

とすると、日本語 (2 byte) まで入ってきます。

$ gawk '/[A-Za-z0-9]/' test-euc.txt
abcdefg
ABCDEFG

で、man page には、

For example, before the POSIX standard, to match alphanumeric 
characters,  you  would have  had to write /[A-Za-z0-9]/.

と書かれていますが、POSIX では LANG=C の時と同じらしいので、

LC_ALL=C gawk '/[[:alnum:]]/' test-utf8.txt
abcdefg
ABCDEFG

となります。

Fedora Core 5 Test 2 で試す

ついでなので、FC5T2 でも試してみた。環境は Fedora Core なので、ja_JP.UTF-8 です。

で、結果は上と全く同じでした。

ここまでが、1/27 の Blog に書いた内容です。


en_US.UTF-8 で試す

試したのは Debian GNU/Linux sarge です。

上の内容で、「en_us.UTF-8」とありますが、このロケールを作成しようとするとエラーになります。「en_us.UTF-8」ではなく「en_US.UTF-8」ですね。

root で /etc/locale.gen に以下を追加します。

en_US.UTF-8 UTF-8

そして、

# locale-gen

と実行します。これで en_US.UTF-8 のロケールが加えられます。

LC_ALL=en_US.UTF-8 gawk '/[a-z]/' test-utf8.txt
abcdefg
ABCDEFG

確かに、gawkとマルチバイト文字と正規表現の書き込みのとおりです。

つまり、

LC_ALL=en_US.UTF-8 gawk '/[A-Z]/' test-utf8.txt
abcdefg
ABCDEFG

となるわけです。

ただし、

日本語版Windowsで調べたところ、日本語ロカールでは
 a a A A b b B B c c C C d d D D... のように
 順序付けられていることが判明。

これが再現しませんね。日本語環境では、大丈夫という結果になっています。

ついで

同じ現象が grep についても ML に書かれていたので、確認してみました。

$ LC_ALL=en_US.UTF-8 grep [a-z] test-utf8.txt
abcdefg
ABCDEFG
$ grep [a-z] test-utf8.txt
abcdefg

そういうことのようです。

$ grep [[:alnum:]] test.txt
abcdefg
ABCDEFG
abcdefg
ABCDEFG

ということです。


  • 要するに LANG をちゃんと設定しないとダメだよということでしょうか? en_US.UTF-8 な人たちは大丈夫なんですかね。 - hi_saito (2006年01月28日 21時13分42秒)
  • LANGというか細かく言うとLC_CTYPEですね。en_USだけでなくて、DEとかIEとかでも同様の報告が出ているようです。影響大きいと思うんだけど思ったよりはレポートの数が少ないかもしれない。USの人はCロカール使えばいいだろうけど、マルチバイト環境の人間にはつらいですよね。どこかいい落としどころがないものでしょうか? - きむら (2006年01月28日 23時33分05秒)
  • レポートを投げてもメインが英語圏なので、反応が少ないですよね。やっぱり、日本発の OSS は LANG=C (デフォルト) だと日本語を表示するようにしてしまって、強引にでも en_US を使わせるとか…。 - hi_saito (2006年01月29日 00時12分48秒)
  • まあロカールが設定されていなかったりCロカールだったら警告メッセージ出すくらいが穏当ですかね。起動できないようにするのはちょっと過激か。 - きむら (2006年01月29日 14時35分31秒)

{{comment}}