CONTENTS

1.動作環境2.Apacheエラーログ3.原因と解決策4.最後に5.参考・出典サイト

MENU

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

CATEGORY

大学 (142) 仕事 (23) 航空宇宙 (108) 写真 (79) 旅行 (33) 飯・酒 (20) コンピュータ (122) その他 (47)

TAG

ARCHIVE

RECENT

自宅を部分的に交換するととても便利! 【駅メモ!】6000 駅達成! 【Archive】『衛星データ利用の方々にとって近いようで触れる機会のなさそうな小話』 @日本衛星データコミニティ勉強会 【写真】今年の写真活動振り返り 2024 【Archive】『衛星スタートアップの FOSS4G 初参加の記録』 @FOSS4G Belem & Asia アフタートーク

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

事象発生日:2017-08-02

記事公開日:-

アクセス数:6901

久しぶりに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)していた.

1[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'; を追加すれば良い.

文字コード周りは[1],[2]が参考になる.

1#!/usr/bin/perl
2 
3use strict;
4use warnings;
5use utf8;
6binmode STDOUT, ':utf8';
修正コード

そういえば,Windowsで書く時は,下のように書くのは常識ですよね.

DOS窓はcp932というゴミしか扱えないので....(まあ,chcpコマンドで出力文字コードを変えることもできるけど,レイアウトがね....)

unixだったら,文字コード周りうまくやってくれるでしょ,っていう考えは甘かったようです.

1use strict;
2use warnings;
3use utf8;
4binmode STDIN,  ':encoding(cp932)';
5binmode STDOUT, ':encoding(cp932)';
6binmode STDERR, ':encoding(cp932)';
WindowsでのPerlソースコード

4.最後に

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

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

5.参考・出典サイト

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

コメントを投稿

名前

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

コメント