- ベストアンサー
日本語のマッチング(正規表現)の解決方法
- 日本語のマッチング(正規表現)を解決するための方法について質問です。
- 質問者は、xxx.txtの内容を変換するプログラムを作成したが、出力ファイルに何も変化がない問題が発生している。
- また、5.8.4では通るが、5.8.7ではエラーが起きてしまうという問題もある。どのように解決すればよいか教えてほしい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>use encoding 'euc-jp';は5.8.4では通りますが、 >5.8.7ではエラーとなってしまいます。 私の環境は5.8.4なので、確認できないですが、 5.8.7でも使えると思いますが・・ use encoding "euc-jp"; open(IN, "<:encoding(euc-jp)", "in.txt"); open(OUT, ">:encoding(euc-jp)", "out.txt"); while($b=<IN>){ $b =~ tr/ぁぃぅぇぉ/ァィゥェォ/; $b =~ s/([イシチニ])イ/$1ー/g; $b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g; print OUT $b; } close(IN); close(OUT);
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>化ける行の断片は、 >番+バン+2/0/0 >で+デ+61/0/0 >お待ち+オマチ+17/0/0 >の+ノ+71/0/0 を use encoding 'euc-jp'; open(IN, "<:encoding(euc-jp)", "EUC.txt"); で読み込んでもエラーにはなりませんでした。
お礼
出来ました!! ありがとうございました. 元のファイルから違うファイルに移し変えたら出来ました. そんなものですね….大変お世話になりました. 私としては20ポイント以上差し上げたい気持ちです. >BLUEPIXY さんが間違うわけなし 結構有名な方なのですね. 私は質問の数が上回っていますが,BLUEPIXYさんを目指して頑張っていきます.
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>すぐの返答は大変うれしいです. 結局なんの解決にもなってないので申し訳ないです・・ >euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39. は、入力ファイルを読み込んで、EUC-JPとして読み込み内部表現であるUnicodeに変換するルールが見つからなかったというようなメッセージです。 通常だったらEUCとして変であるとか 文字コードの領域が全て対応しているとは限らないので、 変換できない文字があるということです。 そういう場合には、入力やコードなどを全てUTF-8で処理するのが常道かと思いますが、 よろしければ試してみたいので、 化ける行の断片を補足していただけませんか? あと、関係ないですが >open(OUT, ">:encoding(euc-jp)","> kekka.txt"); の時には、 >open(OUT, ">:encoding(euc-jp)","kekka.txt"); でいいです。
お礼
>結局なんの解決にもなってないので申し訳ないです・・。 なんて優しい方なのでしょう。本当にありがとうございます。(涙) 最後のリダイレクトのアドバイスもありがとうございます。 まだ質問ですが…。よろしくお願いいたします。
補足
化ける行の断片は、 (jisyo01.txtの内容) 番+バン+2/0/0 で+デ+61/0/0 お待ち+オマチ+17/0/0 の+ノ+71/0/0 などです。 最終結果は で+デ+61/0/0 [で] D e のようになります。 #スクリプト open(IN,"phone.txt"); $j = 0; while($a=<IN>){ chomp $a; @list = split(/\+/, "$a"); $kana[$j] = "$list[0]"; $yomi[$j] = "$list[1]"; $j++; } close(IN); use encoding "euc-jp"; open(IN, "<:encoding(euc-jp)","jisyo01.txt"); open(OUT, ">:encoding(euc-jp)","> kekka.txt"); while($b=<IN>){ chomp $b; @list2 = split(/\+/, "$b"); $b =~ tr/ぁぃぅぇぉ/ァィゥェォ/; $b =~ s/([イシチニ])イ/$1ー/g; $b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g; for($i=0; $i<=258; $i++){ $list2[1] =~ s/$kana[$i]/$yomi[$i]/g; } print OUT "$b [$list2[0]] $list2[1]\n"; } close(IN); close(OUT); use encoding "euc-jp"; open(IN, "<:encoding(euc-jp)","kekka.txt"); open(OUT, ">:encoding(euc-jp)","> kekka2.txt"); @lines = <IN>; @sortedlines = sort @lines; print "@sortedlines\n"; #print $sortedlines[0]; for($i=1; $i<=@sortedlines; $i++){ if($sortedlines[$i] =~ /\s:\s/){ $sortedlines[$i] =~ s/\s:\s/:/; } if($sortedlines[$i] ne $sortedlines[$i-1]){ print OUT $sortedlines[$i]; } } close(IN); close(OUT); use encoding "euc-jp"; require "jcode.pl"; open(IN, "<:encoding(euc-jp)","kekka2.txt"); open(OUT, ">:encoding(euc-jp)",">> 20k.htkdic"); @str = <IN>; foreach $str(@str){ &jcode::convert(\$str, "euc"); } close(IN); print OUT @str; close(OUT); phone.txtの内容(50音の音が入っている) ナ+n a ニ+n i ヌ+n u ネ+n e ノ+n o ハ+h a ヒ+h i フ+f u ヘ+h e ホ+h o など。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Can't locate encoding.pm in @INC >(@INC contains: C:/Perl/lib C:/Perl/site/lib .) は、encoding.pmが無いってことです。 5.8以降のマニュアルには、encodingの記載があるので、 削除されたかインストールがうまくいっていないのでは? もしくは、そもそもバージョンが5.8未満であるとか
お礼
BLUEPIXYさん.すぐの返答ありがとうございます. 質問をしても返答が帰ってこない場合を経験しているので, すぐの返答は大変うれしいです. 補足が長くなってしまいましたが,文字が正常に出力されません…. どのようにしたらよいのかわかりましたらよろしくお願いいたします.
補足
その可能性が高いかもしれません. インストールをやり直してみます. ところで違う問題が出てきてしまいました. もう一度お願いできますか…. スクリプトを走らせると,エラーメッセージが 出た後,出力ファイルにはかなや漢字が文字化け した結果が出力されています. もちろんuse encoding "euc-jp"はopenする前に に必要なのでしょうが…. よろしくお願いいたします. #変換処理 use encoding "euc-jp"; open(IN, "<:encoding(euc-jp)","jisyo01.txt.cha"); open(OUT, ">:encoding(euc-jp)","> kekka.txt"); while($b=<IN>){ chomp $b; @list2 = split(/\+/, "$b"); $b =~ tr/ぁぃぅぇぉ/ァィゥェォ/; $b =~ s/([イシチニ])イ/$1ー/g; $b =~ s/([オクグコゴスズソゾツヅトドヌノフブプホボポムモヤユヨャュョルロ])ウ/$1ー/g; for($i=0; $i<=258; $i++){ $list2[1] =~ s/$kana[$i]/$yomi[$i]/g; #r駻 囁圦q繒灑*r r゜r r r qハzfqロqヌysuオ } print OUT "$b [$list2[0]] $list2[1]\n"; } close(IN); close(OUT); #ソートと重複要素取り除く use encoding "euc-jp"; open(IN, "<:encoding(euc-jp)","kekka.txt"); open(OUT, ">:encoding(euc-jp)","> kekka2.txt"); @lines = <IN>; @sortedlines = sort @lines; print "@sortedlines\n"; #print $sortedlines[0]; for($i=1; $i<=@sortedlines; $i++){ if($sortedlines[$i] =~ /\s:\s/){ $sortedlines[$i] =~ s/\s:\s/:/; } if($sortedlines[$i] ne $sortedlines[$i-1]){ print OUT $sortedlines[$i]; } } close(IN); close(OUT); #ファイルに出力 require "jcode.pl"; open(IN, "kekka2.txt"); open(OUT, "> 20k.htkdic"); @str = <IN>; foreach $str(@str){ &jcode::convert(\$str, "euc"); } close(IN); print OUT @str; close(OUT); エラーメッセージ euc-jp "\xE5" does not map to Unicode at jisyo01_1.pl line 65, <IN> line 39. euc-jp "\xA1" does not map to Unicode at jisyo01_1.pl line 35, <IN> line 94. このようなものが何行も続く.
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>私の環境だとuse encoding "euc-jp";の行で 5.8.7にアップデートしてみましたが、 #1のスクリプトで問題有りませんでした。 INのファイル及びスクリプトが本当にEUCになってますか? エラーメッセージはどのようにでていますか
お礼
すぐの返答ありがとうございます。 またの質問になりますがよろしくお願いいたします。
補足
INファイル及びスクリプトはEUCになっています。 エラーメッセージは、 Can't locate encoding.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .) at jisyo01_1.pl line 14. となっています。
お礼
名前を見てびっくりしました。 以前回答を頂いたBLUEPIXYさんですね。 本当にありがとうございます。 現状は補足のとおりです…。
補足
私の環境だとuse encoding "euc-jp";の行で エラーとなってしまいます。 エディタとして「Perlを始めよう」というもの、 パスはperl.exeのある、binファイルに通してあるのですが…。