- 締切済み
perlで半角カナを検索するには、どうしたらいいのでしょうか?
perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- okmotokun
- ベストアンサー率59% (92/155)
EUC にコンバートできてないです。 データはファイルから読み込んでいますか。 スクリプトの中でSJISで配列を作って、それを読み取ってその文字列をEUCにコンバートするのはうまくいかないようです。 ※ use Jcode; はループの外にした方が良いのでは(実害は無いけど) ※ 何で Jcode::convert($_, 'euc'); を2回やってるのかな? 【HINT】 次のSJISコードの文字列を%エンコードすると右のようになります。 三菱電機 → %8E%4F%95%48%93%64%8B%40 姉鰭電機 → %8E%6F%95%68%93%64%8B%40 東芝 → %93%8C%8E%C5 「三菱電機」が「姉鰭電機」になる原因は次のエンコード間違い。 %4F → アルファベット O %6F → アルファベット o %48 → アルファベット H %68 → アルファベット h
- Suzi
- ベストアンサー率38% (130/334)
メモ帳やワードパッドなどの文字コードは「shift_jis」になっているので、Jcode::convert($_, 'euc'); でeucで出力すると文字化けするのではないでしょうか。 Jcode::convert($_, 'shift_jis'); ではどうでしょうか。
- sakusaker7
- ベストアンサー率62% (800/1280)
>if文なしで、printすると、 とありますが、これは質問にあるスクリプト同様 Jcode::convertは 実行しているのでしょうか? もしそうだったとして、ただ単に入力をそのまま出力しても同様の 文字化けが発生しますか? あとは、Jcode::convert で入力文字コードの指定をしてみるとか。
- Suzi
- ベストアンサー率38% (130/334)
出力しようとしているhtmlのcharsetが、またはそのcgi自体の漢字コードがshift_jisになっていませんか。
補足
ご回答、ありがとうございます。 普通の、メモ帳などで、作成したテキストファイルなのですか。 何か、操作をしないといけないのでしょうか? if文なしで、printすると、下記のように、やはり三菱電機が文字化けしています。 行=1 パナソニック(ナショナル) 行=2 姉鰭電機 行=3 日立 行=4 東芝 行=5 sony 行=6 その他 よろしくお願い致します。
補足
ご回答、有難うございます。 申し訳ございません、文字化けは、有りませんでした。 ただ、半角カナを抽出する為に、if ($_=~ /\x8E/) の条件で、printしたのですが、出力されたのが、下記の2行になってしまいました。 行=2 三菱電機 行=4 東芝 while (<IN>) { use Jcode; chop; $line+=1; Jcode::convert(\$_, 'euc', 'sjis'); Jcode::convert(\$_, 'sjis', 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } よろしくお願い致します。