- ベストアンサー
perl print文で日本語表示するには
- perlのプログラムで、use utf8が宣言されていない時は、print文で日本語が正しく表示されるが、use utf8が宣言されている時は、print文で日本語が正しく表示されないかエラーになる。
- encode('utf-8', $string)やencode('cp932', $string)を試してみたがうまくいかなかった。
- 解決方法は不明。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#!C:/perl/bin/perl use strict; use utf8; use Encode; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string=$year."年".$mon."月".$mday."日 ".$hour."時".$min."分".$sec."秒\n"; print encode('cp932', $string); 実行結果 2018年12月26日 11時41分43秒 $year年 という変数名だと思っているのでしょう。
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>どのようにすればよいでしょうか。 use utf8のプラグマは「プログラムのソースコード内の文字列の漢字はUTF8で記述されてますよ」というプラグマです。 なのでuse utf8と宣言したソースコードは「UTF8で保存」しないとならない。 もし、ソースコードをシフトJISやEUCで記述・保存してあるのであれば my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; の行の「年」や「月」や「日」などの漢字部分は「UTF8の漢字コードじゃないのが理由で正しく解釈できない」ので、エラーになります。 test2.plを「UTF8」で保存して、実行してみて下さい。
お礼
回答ありがとうございます。 その前に一部訂正があります。 No.1の回答者様の補足コメント入力欄に書いてありますので ご確認ください。 > test2.plを「UTF8」で保存して、実行してみて下さい。 test2.plを「UTF8」で保存して実行してみました。 コマンドプロンプトに直接表示した場合は、 日本語の部分が文字化けしていますが、 リダイレクト(perl test2.pl > test.txt 2>&1)すると UTF8形式のファイルが生成されて文字化けはしていませんが、 結果は変更前と同じ(NG)でした。 print $string; print encode('utf-8', $string); print encode('cp932', $string); どれも変更前と同じ結果(NG)になります。 よろしくお願いします。
- maiko04
- ベストアンサー率17% (345/1956)
encode('Shift_JIS', $string); でどうですか?
お礼
回答ありがとうございます。 encode('Shift_JIS', $string); にして実行してみましたが全く同じ結果(NG)になります。 よろしくお願いします。
補足
一部訂正があります。 「print $string;」のPC1の実行結果のみが、 今、実行してみると、以下のようになっていました。 -------------------------------------- Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x94, with no preceding start byte) at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x8c, with no preceding start byte) at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x8e, with no preceding start byte) at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x93, with no preceding start byte) at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected non-continuation byte 0x20, immediately after start byte 0xfa) at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x8e, with no preceding start byte) at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x9e, with no preceding start byte) at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x95, with no preceding start byte) at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0xaa, with no preceding start byte) at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDCont" is deprecated at D:\test\test2.pl line 8. Passing malformed UTF-8 to "_Perl_IDStart" is deprecated at D:\test\test2.pl line 8. Malformed UTF-8 character (unexpected continuation byte 0x95, with no preceding start byte) at D:\test\test2.pl line 8. 2018 N12 26 11 58 34 b -------------------------------------- よろしくお願いします。
お礼
この方法は質問する前に試していたのですが その時はうまくいきませんでした。 しかし、今、実行してみると エラーは出ず日本語が正しく表示されています。 最初、この原因がよく分からなかったのですが、 上記のコードを、No2の回答者様の回答のように、 「Shift+JIS」で保存するとエラーになり、 「UTF8」で保存すると日本語が正しく表示される ことがわかりました。 つまり、「UTF8」で保存しておかなければならない問題と、 変数名の後に日本語が続くと、変数名と日本語の全体が 1つの変数として解釈されてしまう問題の 2つの問題があったようです。 ありがとうございました。