MENU

溶けかけてるうさぎ HP BLOG TOP RECENT ARTICLES POPULAR ARTICLES ABOUT THIS BLOG

CATEGORY

大学 (85) 航空宇宙 (55) 写真 (25) 旅行 (14) 飯・酒 (11) コンピュータ (88) その他 (13)

TAG

ARCHIVE

2018 (92) 2017 (80) 2016 (0)

RECENT

【駅メモ】4年目に突入して,ようやく3000駅突破 【WebRTC】Raspberry Pi搭載ロボットをWebRTCで遠隔操作しようとして失敗した 【航空宇宙】航空宇宙アドベントカレンダー 始まります! 【Perl】YAPC::Tokyo 2019 のチケットを確保しました! 【カメラ】Canonから富士フイルムに乗り換えました

【Apache】cgiエラー Wide character in print at ...pl in line ...

2017-08-02

久しぶりにApachのエラーログ(error.log)を眺めていたら,ものすごい数のWide character in print at ...エラーが発生していた.

これを回避する方法を記録する.

 

トップ画像の出典はこちら

1.動作環境

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

2.Apacheエラーログ

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}
error.log

なんで今まで気づかなかったんだろうか....

まあ,エラーログなんて問題が起きない限り見ないしね.

3.原因と解決策

原因は簡単で,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)';
WindowsでのPerlソースコード

4.最後に

というか,なんでエラーが出ているのに,500 Internal Server Errorは出ないし,出力も化けないんですかね....

理由がわからない.まだまだPerlの理解が足りていないようだ.

5.参考・出典サイト

ja.wikibooks.org. Perl/日本語処理. Retrieved August 2, 2017, from https://ja.wikibooks.org/wiki/Perl/日本語処理
VOYAGE GROUP エンジニアブログ. あなたにも今日こそPerlの文字化けが理解できるたった一つの原則. Retrieved August 2, 2017, from http://tech.voyagegroup.com/archives/465806.html

コメントを投稿

名前

Email (※公開されることはありません)

コメント