みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perl print文で日本語表示するには

perlのプログラムで
use utf8が宣言されていない時(test1.pl)は、
print文で日本語が正しく表示されるのですが、
use utf8が宣言されている時(test2.pl)は、
print文で日本語が正しく表示されないかエラーになります。
encode('utf-8', $string)やencode('cp932', $string)
も試してみましたがうまくいきませんでした。
どのようにすればよいでしょうか。

---test1.pl------------------------------------------------
#!C:/perl/bin/perl
use strict;
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 $string;
-----------------------------------------------------------
実行結果 OK
2018年12月26日 9時36分6秒
-----------------------------------------------------------

---test2.pl------------------------------------------------
#!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 $string;
#print encode('utf-8', $string);
#print encode('cp932', $string);
---------------------------------------------------
実行結果 NG (PC1 Windows7 ActivePerl)
Wide character in print at D:\test\test2.pl line 11.
Global symbol "$year年" requires explicit package name (did you forget to declare "my $year年"?) at D:\test\test2.pl line 8.
Global symbol "$mon月" requires explicit package name (did you forget to declare "my $mon月"?) at D:\test\test2.pl line 8.
Global symbol "$mday日" requires explicit package name (did you forget to declare "my $mday日"?) at D:\test\test2.pl line 8.
Global symbol "$hour時" requires explicit package name (did you forget to declare "my $hour時"?) at D:\test\test2.pl line 8.
Global symbol "$min分" requires explicit package name (did you forget to declare "my $min分"?) at D:\test\test2.pl line 8.
Global symbol "$sec秒" requires explicit package name (did you forget to declare "my $sec秒"?) at D:\test\test2.pl line 8.
Execution of D:\test\test2.pl aborted due to compilation errors.
-----------------------------------------------------
実行結果 NG (PC2 Windows7 ActivePerl)
Malformed UTF-8 character (unexpected continuation byte 0x94, with no precedingstart byte) at C:\test\test2.pl line 8.
(略)
Malformed UTF-8 character (unexpected continuation byte 0x95, with no precedingstart byte) at C:\test\test2.pl line 8.
2018 N12 26 9 5 4 b
-----------------------------------------------------
期待している実行結果
2018年12月26日 9時36分6秒
-----------------------------------------------------

よろしくお願いします。

投稿日時 - 2018-12-26 10:18:00

QNo.9571517

困ってます

質問者が選んだベストアンサー

#!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年 という変数名だと思っているのでしょう。

投稿日時 - 2018-12-26 11:43:30

お礼

この方法は質問する前に試していたのですが
その時はうまくいきませんでした。

しかし、今、実行してみると
エラーは出ず日本語が正しく表示されています。

最初、この原因がよく分からなかったのですが、
上記のコードを、No2の回答者様の回答のように、
「Shift+JIS」で保存するとエラーになり、
「UTF8」で保存すると日本語が正しく表示される
ことがわかりました。

つまり、「UTF8」で保存しておかなければならない問題と、
変数名の後に日本語が続くと、変数名と日本語の全体が
1つの変数として解釈されてしまう問題の
2つの問題があったようです。

ありがとうございました。

投稿日時 - 2018-12-27 09:55:53

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>どのようにすればよいでしょうか。

use utf8のプラグマは「プログラムのソースコード内の文字列の漢字はUTF8で記述されてますよ」というプラグマです。

なのでuse utf8と宣言したソースコードは「UTF8で保存」しないとならない。

もし、ソースコードをシフトJISやEUCで記述・保存してあるのであれば
my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n";
の行の「年」や「月」や「日」などの漢字部分は「UTF8の漢字コードじゃないのが理由で正しく解釈できない」ので、エラーになります。

test2.plを「UTF8」で保存して、実行してみて下さい。

投稿日時 - 2018-12-26 10:55:16

お礼

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

その前に一部訂正があります。
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)になります。

よろしくお願いします。

投稿日時 - 2018-12-26 13:37:34

ANo.1

encode('Shift_JIS', $string);

でどうですか?

投稿日時 - 2018-12-26 10:47:30

補足

一部訂正があります。
「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
--------------------------------------
よろしくお願いします。

投稿日時 - 2018-12-26 13:35:42

お礼

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

encode('Shift_JIS', $string);
にして実行してみましたが全く同じ結果(NG)になります。

よろしくお願いします。

投稿日時 - 2018-12-26 12:17:47

あなたにオススメの質問