[PHP-users 31290] Re: grepでの文字検索とstrposでの文字検索の違い

goungoun gounx2 @ gmail.com
2007年 1月 19日 (金) 16:13:50 JST


こんにちは。

# 既にPHPの話題ではありませんが、
# 個人的に、そんなことあるの?と気になったので。

On Fri, 19 Jan 2007 13:46:10 +0900
"Takamori Mitsuki" <hashibata @ gmail.com> wrote:
> 
> シェルにおいても、この問題が発生することが分かりました。
> 
> ex) grep あ testdata
> 
> testdata
> ------------
> い♪あ
> 
> 結果)
> 検索件数:0
> 


OSは、debian sarge

---------------------------------
$
$ env | grep LANG
LANG=ja_JP.EUC-JP
LANGUAGE=ja_JP:ja:en_GB:en
$ cat hoge
いあ
い♪あ
い♪ あ
あ
い
う
♪い

$ od -t xC hoge
0000000 a4 a4 a4 a2 0a a4 a4 a2 f6 a4 a2 0a a4 a4 a2 f6
0000020 20 a4 a2 0a a4 a2 0a a4 a4 0a a4 a6 0a a2 f6 a4
0000040 a4 0a 0a
0000043
---------------------------------

で、検索
---------------------------------
$ grep あ hoge
いあ
あ
---------------------------------

あら・・・
"♪"含んでるとヒットしませんね

EUCはASCII互換なので、LANG=Cでやってみる

---------------------------------
$ LANG=C grep あ hoge
いあ
い♪あ
い♪ あ
あ
---------------------------------

単純な文字列検索であれば
これでしのげますけど根本解決ではありませんね。

UTF-8での挙動も気になったので確認してみたのですが
こちらは期待通りに検索できました。

EUC固有の問題っぽいです。

ふと、grepの問題なのか?気になったので
さらに perl で確認してみると

---------------------------------
$ LC_ALL=ja_JP.EUC-JP perl -ne 'print if (m/あ/)' hoge
いあ
い♪あ
い♪ あ
あ
$ LC_ALL=C perl -ne 'print if (m/あ/)' hoge
いあ
い♪あ
い♪ あ
あ
---------------------------------

こちらは期待通りでした。

まとめると、

grep で ja_JP.EUC-JP の場合に
"♪"を含んだテキストを処理対象とすると
期待通りに動作しない。

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

ps.
あと気になるのは grep のオプション周りですが。
力尽きました・・・


-- 
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/



PHP-users メーリングリストの案内