稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl界のモブキャラとして暗躍します(謎)。

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 !