ごあいさつ
2008/8/2(土)
■[Perlノート] シフトJIS漢字のファイル名にマッチしてみる
たとえば、./hoge配下に『テストソース.txt』というファイルがあったとします。
検索文字列『ソース』で、./hoge配下を検索して、このファイルにマッチさせるには、以下の感じです。
◆その1:コードはshiftjis、処理はshiftjis、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; while (my $fileName = glob("./hoge/*")) { if ($fileName =~ /ソース/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji00.pl Unmatched [ in regex; marked by <-- HERE in m/メ[ <-- HERE ス/ at kanji00.pl line 6.
しかし、上記ではマッチしません。
というか、正規表現エラーになります。
これは、『ソース』の『ー』の第2バイトが『[』のコードになっているからです。
そして、閉じの『]』がないために正規表現エラーになるのです。
なので、『[』を普通の文字扱いするために、『ソース』を\Qと\Eで囲んでみます。
◆その2:コードはshiftjis、処理はshiftjis、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; while (my $fileName = glob("./hoge/*")) { if ($fileName =~ /\Qソース\E/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji01.pl Unmatch ./hoge/テストソース.txt
しかし、上記ではマッチしません。
なぜかというと、 /\Qソース\E/は、\Qより先に『ソース』文字列が評価されるので、基本的に『[』をエスケープしたに過ぎません。
なので、一度『ソース』文字列を変数に格納してみます。
◆その3:コードはshiftjis、処理はshiftjis、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; while (my $fileName = glob("./hoge/*")) { my $wk = "ソース"; if ($fileName =~ /\Q$wk\E/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji02x.pl Unmatch ./hoge/テストソース.txt
しかし、上記ではマッチしません。
これは、『my $wk = "ソース";』で『ソ』の第2バイトがエスケープ文字『\』のコードになっているからです。
そして、『ソ』の第1バイトと『ー』の第1バイトがくっ付いてしまうのです。たぶん。
なので、変数展開しないようにシングルクォート『my $wk = 'ソース';』にしてみます。
◆その4:コードはshiftjis、処理はshiftjis、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; while (my $fileName = glob("./hoge/*")) { my $wk = 'ソース'; if ($fileName =~ /\Q$wk\E/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji02.pl Match ./hoge/テストソース.txt
今度は、上手く行きました。
ということで、シフトJIS漢字を扱うには大変なわけです。
なので、処理はUTF-8にして、コードと標準入出力をshiftjisにしてみます。
◆その5:コードはshiftjis、処理はUTF-8、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; use Encode; # 標準入出力をutf-8からshiftjisへエンコーディングする use encoding 'shiftjis'; while (my $fileName = glob("./hoge/*")) { # $fileNameをshiftjisからutf-8へデコード $fileName = decode('shiftjis', $fileName); if ($fileName =~ /ソース/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji03.pl Match ./hoge/テストソース.txt
今度も、上手く行きました。
しかし、WINDOWSでの漢字処理は、コードも処理もUTF-8にして、標準入出力をshiftjisが推奨らしい。
なので、スクリプトコードをUTF-8にして・・・。
◆その6:コードはUTF-8、処理はUTF-8、標準入出力はshiftjis
#!/usr/bin/perl use strict; use warnings; use Encode; # スクリプトの文字コードがutf-8であることの明示 use utf8; # 標準出力をshiftjisでエンコーディング binmode STDOUT, ':encoding(shiftjis)'; while (my $fileName = glob("./hoge/*")) { # $fileNameをshiftjisからutf-8へデコード $fileName = decode('shiftjis', $fileName); if ($fileName =~ /ソース/) { print "Match\n"; } else { print "Unmatch\n"; } print $fileName, "\n"; }
実行結果
C:\test>perl kanji04.pl Match ./hoge/テストソース.txt
そう、これが正解みたいですね・・・。
- 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/04/26
- メディア: 大型本
- 購入: 24人 クリック: 754回
- この商品を含むブログ (83件) を見る
トラックバック - http://d.hatena.ne.jp/chaichanPaPa/20080802/1217660826
リンク元
- 19 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP222JP222&q=配列 max
- 17 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=68Y&q=VB6 ラジオボタン Value&btnG=検索&lr=lang_ja
- 10 https://www.google.co.jp/
- 9 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331123707953&ved=0CDUQFjAB&url=http://d.hatena.ne.jp/chaichanPaPa/20080802/1217660826&ei=3lVXT4WVJKn2mAWOoZ29Dw&usg=AFQjCNFne1uoL95mnTl3iYCY9rGdsl414w&sig2=d76te-hcD6kmfBVBZ
- 7 http://www.google.co.jp/search?q=ファイル名 漢字&btnG=検索&hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=hYc&sa=2
- 7 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFQQFjAA&url=http://d.hatena.ne.jp/chaichanPaPa/20080802/1217660826&ei=95gkUI69IOqNmQXm-YDgCQ&usg=AFQjCNFne1uoL95mnTl3iYCY9rGdsl414w
- 6 http://chaichan.web.infoseek.co.jp/perlnote/perlnote2009-11-08.htm
- 6 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=osql&num=50
- 5 http://blog.livedoor.jp/dankogai/archives/51089420.html
- 5 http://www.google.co.jp/search?client=firefox-a&rls=org.mozilla:ja:official&channel=s&hl=ja&q=utf-8からshift-jis&lr=&btnG=Google+検索


