HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Perlで「Wide character in print」が出力される

はじめに

PerlCGIプログラムを書いていて、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";

とする感じ。