Beginner's Rock Official Website

犬土偶日記

海の近くに住みたい

BR日記の使い方

話題:Webプログラミングとか

2019年05月12日

schedule.cgiのUTF-8化

公開日時: 2019年05月21日 20時03分06秒

午後に起きた。DebugのWebサイトのCGIをいづれ全てHTML5且つUTF-8にしようと思つてゐる。文字化けが怖いからあまりやりたくない氣持ちもあるんだが。UTF-8に統一すれば今後は文字化けに苦しむことは無くなるんだが、既にあるShift_JISやEUC-JPのものをUTF-8に變へる段階で壞れる可能性がある。日記などは量が膨大なので全てをチェックすることができない。取り敢へず簡單にできさうなものから。

先日祝日チェックのライブラリを弄つた時に少し觸つたschedule.cgiをUTF-8にする。これはプログラムもデータファイルもEUC-JPで書かれてゐる。まづ本體をUTF-8で保存し直してから色々と書き換へる。他にも修正できるところはしようと思つてゐた。見ると、jcode.plのconvertやcgi-lib.plのReadParseが使はれてゐる。いつ作つたんだよ。これはEncode.pmとCGI.pmにすべきだらう。データもデータベースではなくファイルに記録されてゐる。無料のサーバーを使つてゐた頃はPHPもMySQLも使へなかつたので初期のサーバーサイドのものは全てPerlでプログラムしてデータはファイルに記録してゐた。この機會にデータベースに記録するやうにした方が良いかもしれないが、Perlだと色々面倒なんだよな。PHPで全部作り直すのも面倒だしな。取り敢へずこのままで良いだらう。データファイルの中身もUTF-8にせねばならんが、結構な量があるので自力でテキストエディタで文字コード變換をするわけにはいかない。この程度のデータ量なら單一ファイルに記録でも良かつたのに何故か月ごとに分けて保存されてゐる。2005年くらゐからだから結構な數になつてゐる。

文字コードを變換するプログラムを適當に書いてみた。まづここでハマつた。波ダッシュ問題とか呼ばれてゐるやつ。波ダッシュと全角チルダが上手く變換できないとかで、EUCの「〜」をそのままUTF-8に變換すると半角の「?」になつてしまふ。これは厄介だ。Scheduleのページでは例へば「練習@BELL Bスタ 20:00〜22:00」みたいなのがあつて「〜」は頻繁に使はれてゐる。どうやつても上手く變換できず、ググりまくつて膨大な時間を消費した。結局、Encode::from_to($str, 'euc-jp', 'utf-8'); $str =~ s/\xE3\x80\x9C/\xEF\xBD\x9E/g; といふ具合に「〜」だけ個別で置換することで凌いだ。他にも同じやうな原理で上手く變換できない文字がたくさんあるらしい。厄介だな。もしかしたら「〜」以外にも上手くできない文字がデータにあつて文字化けしてしまつてゐるかもしれない。十數年分も自力でチェックする氣は無い。

データファイルを書き換へた後、schedule.cgi本體の修正。jcode.plを使つてゐた部分をEncode.pmで書き換へる。あらゆる入力をdecodeして、出力前にencodeする。例へ全てUTF-8を使つてゐたとしても、入出力に使ふUTF-8とプログラム内部のUTF-8は違ふらしい。鬱陶しい。全部修正して次はReadParseの部分。CGI.pmのParamは使ひたくない。大幅に書き換へる必要があるからな。調べてみると、互換性のためにReadParseといふ同じ名前のメソッドで同じことができるらしい。ほぼ書き換へ不要。それでやつてみたら無事に動いた。次はスケジュール編集用のプログラム。これは一般の人が觸れるものではない。バンドメンバー專用のプログラムだ。スケジュールの内容を新規登録したり削除したり修正したりするやつ。これも結構大變だつたが、何とか修正した。ところどころに文字化けが發生して苦しんだが無事に全部修正できた。自分のPC内では問題無く動く。

これでOKだらうと思つてアップロードしたら全然OKではなかつた。エラーは出ないのだが、schedule.cgiがまともに動かない。今月しか表示できない。移動用のリンクは表示されるのだが、4月をクリックしても6月をクリックしても5月が表示される。年と月をURLの後ろにつけてプログラムに渡してゐる。直に去年の年月を打ち込んでみても今月を表示する。年が指定されなければ現在時刻を取得して今月の分を表示するといふ仕組みになつてゐる。今月しか表示しないといふことは、プログラムに何も値が渡つてゐないといふことだ。リンクのURLには確かに年月がついてゐる。それがプログラム内で認識されてゐないといふことは年や月の變數にURLのQUERY_STRINGから代入されてゐない。つまりReadParseが機能してゐない。自分のPC内ではちやんと動いてゐるのにレンタルサーバー上では動いてゐない。CGI.pmのReadParseが何故か使へてゐない。どういふことだらうか。Paramで1つづつやるのは面倒なので、Varsでハッシュに一括代入してみた。そしたら自分のPCでもレンタルサーバーでも無事に動いた。何故ReadParseだとダメなんだらう。互換性のために殘してあるやつなのに新しいバージョンでは使へなくしたんだらうか。今度こそこれでOKだ。と思つたが、まだだ。編集用のプログラムの方もReadParseからVarsに變へておかねば。修正してアップロードし直し、動作チェックをしてみた。新規登録をしてみたり削除してみたり。文字化けが無いか確認もする。HTML5化は特に苦勞は無い。ヘッダ部分の出力ライブラリがHTML4用とHTML5用に別々に用意してある。引數は全く同じなので呼び出し部分だけ書き換へればOK。何とか終つたが、まさかたつたこれだけのことで數時間も消費するとは思はなかつた。日記CGIの修正は何十時間もかかるかもしれんな。ていふか不可能だらう。データの文字コードを變へても量が多すぎて文字化けチェックは不可能だ。

(1.3)Anniversary song、fake、MIRAI、turning、トウダイモトクラシー、pain、The Wild Wind、IT'S SHOWTIME!!、みかんのうた、パルス、ONE FOR THE ROAD、SUPER LOVE SONG、RING、Enter Sandman、アクアブルー。

ギター練習47分、讀書18ページ。

話題:Webプログラミングとか

Info.
公開日時2019年05月21日 20時03分06秒
本文文字数2737文字 (タグ込み)
URLhttps://orca.xii.jp/br/diary/diary.cgi?id=dogoo;date=20190512
Comments

コメントはありません。

コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しBeginner」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。