Perlの初心者向けの本を見ながら勉強を進めているのですが、途中で文字化けしてしまい、解決方法もその本には書かれていないので困っています。環境はWindowsです。
以下のスクリプトを実行すると、
$string = 'あいうえお';
$string =~ tr/あ/い/;
print "$string\n";
以下の様な結果になります。これは問題ありません。
いいうえお
しかし、「い」に変換する所を、「イ」に変換する様に書き換えた、以下のスクリプトを実行すると、
$string = 'あいうえお';
$string =~ tr/あ/イ/;
print "$string\n";
以下の様に、文字化けした結果になります。
イΔΖΘΚ
WEBで調べ、いくつか処理を追加したりしてみたのですが、エラーが出るだけで解決しませんでした。
文字化けする理由と対処法をご存知の方がおられましたら、お教え頂けないでしょうか。
No.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を前提に書かれているものと推察されます。
外部ファイルの読み書きで日本語を使用する場合にも同様の処理が必要になりますので注意が必要になると思います。
ご回答、ありがとうございます。
お教え頂いた通りにしてみましたら、無事、目的の結果が表示されました。ありがとうございました。
出力の件と、外部ファイルの読み書きの件も、大変参考になりました。ありがとうございました。
おっしゃる通り、今回の本は、中古の古い本でして、内容が古いのです。基礎だけ学べれば良いと考えていたのですが、浅はかでした。こういうものは、やはり最新のものを学ばないと駄目ですね。反省しました。
前にプログラマーの方と話した時に、「Perlは古い言語だから」と言っていたのですが、この本が書かれた頃は、まだUTF-8が広まる前だったのでしょうか。なんにせよ、きちんと表示出来てよかったです。
もう本は、残り半分を切っていますので、一応最後まで読もうと思いますが、読み終わったら、最新の本を買うか、WEBで最新のPerlの情報を解説しているサイトが見付かれば、そちらを拝見しようと思います。
大変助かりました。本当にありがとうございました。
No.1
- 回答日時:
日本人が書いた入門書だと多分文字コードについて書いてあると思うのですが、翻訳書でしょうか?
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モードにしてください。
ご回答、ありがとうございます。
今回読んでいる本は、翻訳書ではないのですが、中古の古い本なので、そのせいだと思います。最新のものを買うべきでした。
Perlは、そのままでは日本語等には対応していないのですね。勉強になりました。
つまり、全角一文字を変換していたつもりが、半角二文字を変換していたということでしょうか。
「use utf8;」と「chcp 65001」の件も、大変参考になりました。本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlについての質問 2 2022/10/17 15:25
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 2 2022/11/18 15:34
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonスクリプトの停止方法に...
-
perl起動方法
-
VBScriptのデバッグ方法につい...
-
VBScriptでCurrentDirectoryを...
-
TeraTermマクロでの出力キャッチ
-
VBSを利用して、IEのタブを自動...
-
setuid と mkdir
-
Excel VBAでリンク切れをチェッ...
-
open MAILでの"|"
-
ユーザー定義関数に#NAME?が返...
-
Perlソースコードをコンパイル...
-
LCD ディスプレイを Raspberry ...
-
関数の引数にクラスを使いたい
-
Cygwin インストール Perlを使...
-
例外処理のフローチャートの記...
-
ユーザーフォーム上に表示され...
-
erf(x)とerfc(x)のカタカナ読み...
-
Excel VBAで、ユーザーフォーム...
-
Perlで環境変数を設定するには
-
印刷後メッセージボックスを表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Cからシェルを起動し返り値をハ...
-
Perlのライセンス
-
VBScriptでCurrentDirectoryを...
-
"JScript"が見つかりません!
-
powershellで関数名を変更する...
-
[ASP]条件によってインクルード...
-
VBSで自動ログインについて
-
cygwinでcshが認識されず困って...
-
UWSCのスクリプトにラグが発生...
-
ADサーバにおけるログインID,PC...
-
VBSを利用して、IEのタブを自動...
-
Perlスクリプトで文字化けして...
-
CシェルプログラミングをCygwinで?
-
perl起動方法
-
vbs: オブジェクトがコレクショ...
-
perlスクリプトのブラウザURLか...
-
TeraTermマクロでの出力キャッチ
-
awkの処理速度を改善したい
-
PythonからPhotoshopスクリプト...
-
pythonスクリプトの停止方法に...
おすすめ情報