use utf8;を使用して"Wide character in print at〜"というエラー文が出た時の対処について

下記サブルーチンを実行したところ、"Wide character in print at〜"というメッセージが表示された。

&print_temp($temp_ref, $date);
sub print_temp{
    my ($temp_ref, $date) = @_;
    printf (qq/%sの12:00の気温は%s°cです。\n/, $date, $temp_ref->{"12pm_temp"});
    printf (qq/%sの最高気温は%s°cです。\n/, $date, $temp_ref->{"temp_max"});
    printf (qq/%sの最低気温は%s°cです。\n/, $date, $temp_ref->{"temp_min"});
}

 

エンコーディングしていないのが問題だと判明。 

参考:Perl の文字列エンコーディングの話 | Hachioji.pm 日めくりテックトーク


 

先ほどのコードの書き方だと、内部表現をそのまま出力しようとしていたようで、下記のようにエンコードしたところエラーが消えた。

 

&print_temp($temp_ref, $date);
sub print_temp{
my ($temp_ref, $date) = @_;
my $str_1 = qq/$date/.qq/の12:00の気温は$temp_ref->{"12pm_temp"}°cです。\n/;
my $str_2 = qq/$date/.qq/の最高気温は$temp_ref->{"temp_max"}°cです。\n/;
my $str_3 = qq/$date/.qq/の最低気温は$temp_ref->{"temp_min"}°cです。\n/;

my $enc_str_1 = encode('utf-8', $str_1);
my $enc_str_2 = encode('utf-8', $str_2);
my $enc_str_3 = encode('utf-8', $str_3);

print $enc_str_1;
print $enc_str_2;
print $enc_str_3;
}