事象発生日:2017-08-02
記事公開日:-
アクセス数:6594
久しぶりにApachのエラーログ(error.log
)を眺めていたら,ものすごい数のWide character in print at ...
エラーが発生していた.
これを回避する方法を記録する.
トップ画像の出典はこちら.
Ubuntu Server 16.04.2 LTS
Apache HTTP Server 2.4.18 (Ubuntu)
perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux-gnu-thread-multi
Apacheエラーログ(error.log
)を確認すると,下のようにエラーが出ているのがわかる.
なお,エラーが出ているのにもかかわらず,500 Internal Server Errorは出ない.
これが1アクセスされるたびに複数(おそらくprint
されるたび)に出るため,error.logが肥大化(~ 1000 MB)していた.
[Wed Aug 02 16:28:22.545634 2017] [cgi:error] [pid ${pid}:tid ${tid}] [client ${ip}:${port}] ${?}: Wide character in print at ${cgi-path} line ${line-no}.: ${cgi-path}, referer: ${referer}
なんで今まで気づかなかったんだろうか....
まあ,エラーログなんて問題が起きない限り見ないしね.
原因は簡単で,flagged UTF-8(つまりUTF-8のPerl内部表現)になっていたためだ.
そこで以下のように6行目の binmode STDOUT, ':utf8';
を追加すれば良い.
#!/usr/bin/perl use strict; use warnings; use utf8; binmode STDOUT, ':utf8';
そういえば,Windowsで書く時は,下のように書くのは常識ですよね.
DOS窓はcp932というゴミしか扱えないので....(まあ,chcp
コマンドで出力文字コードを変えることもできるけど,レイアウトがね....)
unixだったら,文字コード周りうまくやってくれるでしょ,っていう考えは甘かったようです.
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)';
というか,なんでエラーが出ているのに,500 Internal Server Errorは出ないし,出力も化けないんですかね....
理由がわからない.まだまだPerlの理解が足りていないようだ.
名前
Email (※公開されることはありません)
コメント