WindowsパソコンでPerl置き換え演算子s// で発生した文字化けを Encode.pm でスマートに解決!
マルチバイト文字列が母国語の我々を常に悩ませる問題。
そう、文字化け!
1年ちょい前に書いたエントリーでも文字化けについて書いてるけど、
今日もややハマりそうになって、「perl Encode.pm」でググると
自分のブログに到着。
おかげでスムーズに解決。ありがとう1年ちょい前の自分!
アクセス解析なんか見てると、文字化け系の検索が多いので、
今日の事例を紹介したら少しはお役に立つのでは。
文字列の扱いの基本は
______ ________________ ______ | | | | | | | 入力 |======>| perl の処理 |======>| 出力 | |______| |________________| |______| 入力をdecode 出力前にencode
では、さっそくプラクティス!!
■主な登場ファイル
(1)idle.txt ・・・読み込むファイル(保存文字コード形式SJIS)
(2)replace_name.pl ・・・処理するPerlスクリプト(保存文字コード形式UTF-8N)
(3)idle_now.txt ・・・出力するファイル(保存文字コード形式SJIS)
■(1)idle.txt の内容
経済が不況になるとアイドルが活躍すると言う評論家がいます。 長引く平成不況に躍進したのはAKB48(*゚∀゚)=3 AKB48(*゚∀゚)=3は紅白歌合戦に出場するなど、 テレビで見ない日はないというくらい激しく活動しています。 EOF
■行いたい処理
文章中の「AKB48(*゚∀゚)=3」を「ももいろクローバーZ(*゚∀゚)モノノフ=3」に書き換えたいっ!!
■(2)replace_name.pl の内容
#!/perl/bin/perl # # Scripted by Perl48 2013.03.02 use strict; use warnings; use utf8; use 5.010; # なんとなくsayを使いたいだけ use Encode; # 読み込むファイルと書き込むファイル my $file_r = './idle.txt'; my $file_w = './idle_now.txt'; # ファイルハンドルをオープン open my $r, '<', $file_r or die "Can't openfile: $file_r: $!"; open my $w, '>', $file_w or die "Can't openfile: $file_w: $!"; while (my $line = <$r>) { chomp $line; # 読み込んだ$line を perl内部文字コードにデコード $line = decode("cp932", $line); # 「AKB48(*゚∀゚)=3」を「ももいろクローバーZ(*゚∀゚)モノノフ=3」に置き換え $line =~ s/AKB48\(\*\゚∀\゚\)=3/ももいろクローバーZ\(\*\゚∀\゚\)モノノフ=3/; # cp932にエンコードして出力。今っぽくsayしてみる #say encode("cp932", $line); # コマンドプロンプトへ表示テスト say {$w} encode("cp932", $line); } # ファイルハンドルを閉じる close $w; close $r;
■コマンドプロンプトに表示した結果
Perlで文字化けしちゃったら、Encode.pm について学ぶチャンス!
いつやるか?今でしょ!
Enjoy Encode.pm !