プロが教える店舗&オフィスのセキュリティ対策術

Perlの初心者向けの本を見ながら勉強を進めているのですが、途中で文字化けしてしまい、解決方法もその本には書かれていないので困っています。環境はWindowsです。

以下のスクリプトを実行すると、

$string = 'あいうえお';
$string =~ tr/あ/い/;
print "$string\n";

以下の様な結果になります。これは問題ありません。

いいうえお

しかし、「い」に変換する所を、「イ」に変換する様に書き換えた、以下のスクリプトを実行すると、

$string = 'あいうえお';
$string =~ tr/あ/イ/;
print "$string\n";

以下の様に、文字化けした結果になります。

イΔΖΘΚ

WEBで調べ、いくつか処理を追加したりしてみたのですが、エラーが出るだけで解決しませんでした。

文字化けする理由と対処法をご存知の方がおられましたら、お教え頂けないでしょうか。

A 回答 (2件)

スクリプトの先頭に以下の4行を追加して、文字コードutf-8で保存してみてください。


use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

windowsで普通にスクリプトを保存するとshift_jis(正確にはcp932)とう文字コードで保存されます。
ところがperlは、文字コードutf-8で書かれていると思って処理しますのでcp932で書かれたスクリプト内の文字定数は正しく認識されずに誤動作します。したがってスクリプトをutf-8で保存する必要があります。

さらにコマンドプロンプトはcp932で文字を表示しますので、perlで文字出力する場合にはutf-8をcp932に変換してあげる必要があるのです。


参考にされている書籍に上記の注意がないということは、古いバージョンのperlを前提に書かれているものと推察されます。

外部ファイルの読み書きで日本語を使用する場合にも同様の処理が必要になりますので注意が必要になると思います。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

お教え頂いた通りにしてみましたら、無事、目的の結果が表示されました。ありがとうございました。

出力の件と、外部ファイルの読み書きの件も、大変参考になりました。ありがとうございました。

おっしゃる通り、今回の本は、中古の古い本でして、内容が古いのです。基礎だけ学べれば良いと考えていたのですが、浅はかでした。こういうものは、やはり最新のものを学ばないと駄目ですね。反省しました。

前にプログラマーの方と話した時に、「Perlは古い言語だから」と言っていたのですが、この本が書かれた頃は、まだUTF-8が広まる前だったのでしょうか。なんにせよ、きちんと表示出来てよかったです。

もう本は、残り半分を切っていますので、一応最後まで読もうと思いますが、読み終わったら、最新の本を買うか、WEBで最新のPerlの情報を解説しているサイトが見付かれば、そちらを拝見しようと思います。

大変助かりました。本当にありがとうございました。

お礼日時:2015/06/28 21:56

日本人が書いた入門書だと多分文字コードについて書いてあると思うのですが、翻訳書でしょうか?


Perlはそのままでは日本語など複数バイトの文字に対応していません。
なので、SJISで上記プログラムを書いて実行すると、
$string = "\x82\xA0\x82\xA2\x82\xA4\x82\xA6\x82\xA8";
$string =~ tr/\x82\xA0/\x83\x43/;
print "$string\n";
と同じことになります。すべてのx82をx83に置き換えることになり、置換結果は、"\x83\x43\x83\xA2\x83\xA4\x83\xA6\x83\xA8" です。
x83 x43は片仮名の「イ」ですが、x83 xA* のあたりはギリシャ文字です。

簡単には、スクリプトの文字コードをutf-8にして、先頭に use utf8; を追加すればutf-8の文字コートで正しく処理されます。
Windowsのコマンドプロンプトでスクリプトを実行する場合は、chcp 65001 コマンドを実行してコマンドプロンプトをutf-8モードにしてください。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

今回読んでいる本は、翻訳書ではないのですが、中古の古い本なので、そのせいだと思います。最新のものを買うべきでした。

Perlは、そのままでは日本語等には対応していないのですね。勉強になりました。

つまり、全角一文字を変換していたつもりが、半角二文字を変換していたということでしょうか。

「use utf8;」と「chcp 65001」の件も、大変参考になりました。本当にありがとうございました。

お礼日時:2015/06/28 21:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!