Perlで「Wide character in print」が出力される
はじめに
PerlでCGIプログラムを書いていて、WebサーバーのログにWide character in print
が出力されるのが気になっていた。
その原因を最近ようやく調べられたのでメモ。
検証環境
$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) $ perl -v This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi (with 44 registered patches, see perl -V for more detail)
> C:\xampp\perl\bin\perl.exe -v This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread
現象
UTF-8で保存した以下のコードで発生する。
use utf8; print "ハローワールド\n";
CentOS 7環境での実行結果。
Wide character in print at test1.pl line 3. ハローワールド
Windows環境のターミナルではもちろん文字化けするが。
原因
Wide character in print
の原因は、「UTF-8フラグがついた内部文字列をprintに渡しているため」だそう。
対策
適切な文字エンコーディングに変換してあげればいいので、UTF-8で出力するなら、
use utf8; use Encode; print Encode::encode('UTF-8', "ハローワールド\n");
あるいは
use utf8; binmode(STDOUT, ":utf8"); print "ハローワールド\n";
Windows環境向けなら、
use utf8; use Encode; print Encode::encode('Shift_JIS', "ハローワールド\n");
とするか、Shift_JISで保存して
use Encode; print "ハローワールド\n";
とする感じ。