CGI掲示板の文字化け発生
昨日食べたものは、ラーメンとシロノワールとラーメン(2回目)です。
一昨日食べたものは忘れましたね。
KENT-WEBさんの掲示板(MT-BOARD 2)を利用させていただいております。
KENT-WEB:https://www.kent-web.com/
先日、jcode.plをjacode.plにおきかえて、サーバのPerlバージョンアップに対応しまして500エラーを回避できましたが、あらたに書き込みすると文字化けしてしまうという報告が。
症状確認
インデックス
スレッド
どちらも文字化けしていました。手ごわそうです・・・。
考察
先日入れ替えたjcode.plにかわるjacode.pl、これが怪しいと思いWinMergeで比較しました。
Diff箇所多すぎて、あたりのつけようがないです。
文字化けといえば文字コード問題、ファイルの文字コードを調べていたら、最近投稿があったレスが格納されているファイルがShift-JISになっていました。本来ならばUTF8であるはずなのに。
インデックスのファイル(index.cgi)、
ファイルの先頭2行は文字化けしておらず、後半から文字化け・・・
そして文字コードがShift-JIS
何かしら掲示板に書き込むと既存のUTF8ファイルの先頭にShift-JISな日本語が挿入されてしまい、
テキストエディタは先頭行のデータだけをみて文字コードを判断するため、ShiftJISとして判定され、後部が文字化けされるのではないかと。
WEBサーバでは逆の事がおこっていて、データファイルをUTF8として読み込むため、最近のShiftJISで書かれた部分の書き込みのみが文字化け、過去のデータ(UTF8で書かれている)は正しく表示される、と推測しました。
書き込みに関する処理は、init.cgiに書かれているようで、勘でいじって、書き込みテストをしたら変化があり、文字化けせずに書き込みできていました!
何度かテストを繰り返して大丈夫だろうと確信を得たので暫定処置にうつります。
処置
以下、順番に行っていきます。
書き込み処理部分の文字コード指定(sjis->utf8)
sjisで指定している行をコメントアウトし、utf8で指定している行を追加。
既存のレスの修正
logディレクトリの該当するスレッドのcgiファイルを修正します。
ローカルにダウンロードして、文字化けしていない部分を別のファイルに抜き取ります。
抜き取られたファイルはそのままShiftJISのまま保存します。(ファイルAとします)
抜きっとった部分はテキストエディタに貼り付けて別名で保存します。(ファイルBとします)
ファイルAを開きます。テキストエディタからアラートがでるのでエンコードの種類をUTF8に指定しなおし上書き保存します。
すると、UTF8で保存されたファイル(ファイルA)は文字化けが直りました。
文字化けしていないファイルBと文字化けを直したファイルAを結合します。
そしてこれを本来のファイル名、000109.cgiとして保存。
FTPでアップロードします。
既存のインデックスの修正
「既存のレスの修正」と同様の作業を行います。
文字化けしていない先頭行を別ファイルへ分離、既存のファイルを開きなおしてUTF8で保存、別ファイルと既存のファイルの結合をしました。
同じ修正を別階層のBBSにも適用
BBSシステムを入れ子にしているため、もう一つのinit.cgiも変更しておきます。
終わりに
一か月ぐらい悩むだろうと覚悟をしていたので、ラッキーでした。
文字化け問題はいつの時代も心臓に悪いです。
お付き合いありがとうございました。
Discussion