• 締切済み

perlで半角カナを検索するには、どうしたらいいのでしょうか?

perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。

  • Perl
  • 回答数4
  • ありがとう数1

みんなの回答

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.4

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)
回答No.3

 メモ帳やワードパッドなどの文字コードは「shift_jis」になっているので、Jcode::convert($_, 'euc'); でeucで出力すると文字化けするのではないでしょうか。  Jcode::convert($_, 'shift_jis'); ではどうでしょうか。  

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>if文なしで、printすると、 とありますが、これは質問にあるスクリプト同様 Jcode::convertは 実行しているのでしょうか? もしそうだったとして、ただ単に入力をそのまま出力しても同様の 文字化けが発生しますか? あとは、Jcode::convert で入力文字コードの指定をしてみるとか。

trouble09
質問者

補足

ご回答、有難うございます。 申し訳ございません、文字化けは、有りませんでした。 ただ、半角カナを抽出する為に、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"; } } よろしくお願い致します。

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.1

出力しようとしているhtmlのcharsetが、またはそのcgi自体の漢字コードがshift_jisになっていませんか。

trouble09
質問者

補足

ご回答、ありがとうございます。 普通の、メモ帳などで、作成したテキストファイルなのですか。 何か、操作をしないといけないのでしょうか? if文なしで、printすると、下記のように、やはり三菱電機が文字化けしています。 行=1 パナソニック(ナショナル) 行=2 姉鰭電機 行=3 日立 行=4 東芝 行=5 sony 行=6 その他 よろしくお願い致します。

関連するQ&A

  • 半角カナから全角カナに変換

    Jcode.pmを使用して半角カナから全角カナに変換したいのです。 こちらの過去ログを拝見し、以下のようなロジックを記述したのですが、 ”Undefined subroutine &Jcode::h2z_euc called at test_jcode.pl line 7.”というエラーが出てしまいます。 use Jcode; $line = 'アイウエオ'; $ato = &Jcode::h2z_euc(\$line); print $ato, "\n"; どなたかご回答よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Perlの文字コード変換について

    ActivePerl-5.14を使っているのですが、文字コードの変換はどのようにすればいいのでしょうか。 ローカル環境で動かしているのですが、Shift-JISのテキストを読み込んで、EUC-JPに変換したいと思っているのですが、 今まで5.8を使っていたので、Jcodeを使って、&Jcode::convert(\$txt,'euc'); としていたのですが、5.14ですと use Jcode;  の時点でエラーになってしまいます。 use Encode; を使って、 from_to($txt, 'shiftjis', 'euc'); としてみましたが、 from_to($txt, 'shiftjis', 'euc'); のところでエラーになってしまいます。 ActivePerl-5.14ですと、どのように文字コードの変換をすればいいのでしょうか。 どなたか教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Jcode,pmを使った連続変換に失敗してしまう

    フォームから入力された内容について、 全角数字を半角数字へ、半角カナを全角カナへ変換したいので、 Jcode.pmを使ったのですが、たとえば、 「全角数字を半角数字」だけとか、「半角カナを全角カナ」だけ だとうまくできますが、連続して両方変換しようとすると Jcodeのエラー「Not a SCALAR reference at Jcode.pm line 626」がかえってきてしまいます。 このようなコードを書いています。 use Jcode; $AAA = 'あいう012カキクser'; (実際はフォームからのデータ) &Jcode::convert(\$AAA, 'euc'); my $j = Jcode->new(); $j->set($AAA, 'euc'); $BBB = $j->tr('0-9A-Za-z', '0-9A-Za-z'); (数字変換:ここまでは成功する) my $j = Jcode->new(); $j->set($BBB, 'euc'); #1 $CCC = $j->h2z->euc; (カナ変換:失敗してエラーが発生する) コードはEUCで書いています。どうも #1 のところで、 2行上であらかじめJcodeによって変換されたものが格納されている 変数$BBBを指定するとエラーが起きるようです。#1のところで、 $j->set($AAA, 'euc'); #1 $CCC = $j->h2z->euc; とするとエラーは起きないのです。 変換の順番をいれかえても現象は同じでした。 どうすれば両方の変換ができるようになるでしょうか。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでUTF8をEUCに変換

    こんにちは、お力を貸して下さい。 OSX上で日本語のファイル名を取得し そのファイル名をeucに変換しようとすると 半濁音付きのカナが文字化けを起こしてしまうのです。 Web上で “$euc = Jcode($euc, 'utf8')->z2h->h2z->euc;” で、できないこともないみたいだったので、さっそくやってみたんですが… 変換したいファイル名は、「1ドキュメント」とします。 -------------------------------------- #!/usr/bin/perl use strict; use Jcode; my $path = "パスがはいっている"; my @files; opendir DIR, $path; @files = grep /^1/ && -f "$path/$_", readdir(DIR); closedir DIR; foreach (@files) { my $euc = $_; $euc = Jcode->new($euc, 'utf8')->z2h->h2z->euc; print "$euc\n"; } exit; -------------------------------------- 結果:1ト〓キュメント やっぱり文字化けしましたTT 新しい解決法がありましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字列検索の結果を赤で表示したい

    全文検索のフリーソフトwwwsrch.cgiのソースのたぶん次の箇所が、検索結果を赤で表示している箇所だと思いますが、はて、自分の力ではこれを読みこなせません。  どなたか、もし基本的なかたちだけでも素描していただけないでしょうか。 for ($j = $imin; $j <= $imax; $j++) {  $line = $lines[$j];  &jcode'convert(*line, "euc");  $line =~ s/<[^>]*(>|$)//g;  $tmp = $word;  &jcode'convert(*tmp, "euc");  if ($jflag) {   $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;    }  #$line =~ s/($tmp)/<B>$1<\/B>/ig; $line =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; &jcode'convert(*line, $kcode_cgi, "euc"); print "$line "; }

    • ベストアンサー
    • Perl
  • Jcode.pmでconvertできない

    あけましておめでとうございます。 早速ですが、皆様のお力を拝借したく。 WindowsXPSP2+ActivePerl5.6.1でJcode.pmを使用して、utf8へ変換しようとしました。 http://okwave.jp/qa2600582.html を参考にJcode.pmを導入し(とある事情でインストールしておりません)、以下のソースを記述しました。 ちなみに"sjis"で記述しております。 #!/usr/local/bin/perl use lib "./lib"; use Jcode; $buf = "てすてすてす"; print "BeforeCode=".Jcode::getcode($buf)."\n"; Jcode::convert( \$buf, "utf8"); #$j = Jcode->new($buf); #$buf = $j->utf8; print "$buf\n"; print "AfterCode=".Jcode::getcode($buf)."\n"; exit; すると BeforeCode=sjis AfterCode=euc と表示され、"utf8"を指定したにも関わらず、"euc"に変換されてしまいました。 次に、上記ソースの中ほどを #Jcode::convert( \$buf, "utf8"); $j = Jcode->new($buf); $buf = $j->utf8; と書き換えてみました。すると、 BeforeCode=sjis Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255. とエラーが出てしまいます。 見た感じeuc_utf8が存在しないと言われているようですが、Jcode\Unicode\NoXS.pmに存在しています。 環境に問題があるような気はしますが、どのようにすれば"utf8"への変換が成功するのでしょうか?ご教授いただければ幸いです。 ちなみに上記ソースで Jcode::convert( \$buf, "jis"); Jcode::convert( \$buf, "euc"); Jcode::convert( \$buf, "sjis"); はすべて成功し、指定した文字コードに変換されました。 "utf8"への変換だけが失敗するという状況で、新年早々頭を抱えております。

    • ベストアンサー
    • Perl
  • スマートに euc ページを sjis にする方法

    euc でかかれた htmlページを sjis にしたいのですが、 私が思いつく方法だと、open で開けて一行一行読み込み jcode::convert(\$input, 'sjis'); とかやって・・・それをまた、別のファイルに 一行一行保存・・・とかくらいしか思いつかないの ですが、もうちょっとマシな方法はないものでしょうか。

    • ベストアンサー
    • Perl
  • 置換の順番について

    置換する目的は 半角カナを全角カナにする事なのですが、そこで問題が生まれました。 sjisに変換した後に、置換をすると文字化けになり、反対にする事によって正常に置換する様になっています。良くそこの仕組みが分からないのですがどうか教えて頂けないでしょうか?宜しくお願いします。 ###参照プログラム### ★#半角文字を全角文字に置換するケース &jcode::h2z_sjis(\$value); &jcode::convert(*value, 'sjis'); ★#文字化けを起こすケース &jcode::convert(\$value, 'sjis'); &jcode::convert(\$str, 'euc'); print "str : $str<br>\n";

専門家に質問してみよう