
令和の今時、EUC-JPで書かれたWebシステムに出会いました。
これはとある開発現場のプログラムコードを見た時に、サーバーのデフォルト設定が、EUC-JPになっていたので、
そのWebサービスのプログラムをチェックしてみたところ、EUC-JPベースで書かれていて、
それらをリカバリーするために、一括コンバートを試みたという話です。
何故EUC-JP???
お察しの方もいるかもしれませんが、このWebサイトは、運用15年オーバーで、もう時期20年近くになるサイトです。
まだスマートフォンが登場する前のガラケーと称した携帯電話時代からの古代遺跡サイトでした。
通常のホームページでも、
Shift-JISエンコードが使われていたケースが多く、
サーバーもShift-JISでの文字エンコードで扱う事が普通に行われていた時代でした。
EUC-JPも、そこそこ好まれていたのですが、UTF-8での構築はかなり少なかったという記憶があります。
そもそもUTF-8は、HTML5での標準文字エンコードとして設定された2008年以降ぐらいからWeb業界に順次浸透していった文字エンコードなので、
今回ターゲットにしているサイトがEUC-JPで構築されていた事に対しては、何ら不思議ではありません。
でも、今時の思考で考えると「あり得ない!」という風に考えてもおかしくないし、HTML4からHTML5への切り替わりを経験していないエンジニアにしてみれば、全く意味がわからないでしょうね。
そして、このサイト、内部システムで使っているAPIで
XMLを発行していて、そのために、UTF-8エンコードでXMLだけは表示しているんですよね。
もっと言ってしまえば、とあるテキストファイルを参照してシステム利用する仕様になっているんですが、そのテキストファイルがShift-JISで書かれていたんですよ。
もはや
文字エンコード・カーニバル状態です。
普通のプログラマーであれば、どれかに統一するはずですよね。
じゃないと、いちいち変換するための無駄コードがサーバー処理を圧迫しますからね。
それに、プログラミング時に、文字エンコードをいちいち切り替えるなんてなかなかの不便環境ですよ。
きっと、それぞれ構築したプログラマーが違っていて、それぞれの仕様で勝手に作り上げて最後に合体したという結合計画が甘すぎるスィートプロジェクトだったんじゃないかと想像してしまいました。
もうひとつの時代背景
このブログで、何度も言っていますが、HTML5は本当にすごい進化を遂げたバージョンアップだったわけです。
これは、AppleがiPhoneを販売し始めた2007年を皮切りに、これまでFlashというリッチコンテンツで、Webサイトのアニメーションや動画などを統括していたんですが、
AppleがHTML5になれば、もっとパケットコストの良いインターネットコンテンツが提供できるという事と、Webからアプリへの切り替えのための施策だったのではないかと言われています。
(あと、AppleとAdobeの仲の悪さも原因とか・・・)
という事で、今の時点でも主流のスマートフォン主流のWebサイトとして、HTMK5とCSS3を今後は使おうという流れになり、
スマホサイト構築する人は、Flashが使えないので、必然的にHTML5を学習して、サイトのリニューアルを余儀なくされてきました。
ちなみに、Androidが、Flashを廃止したのは、2020年12月なので、コロナ真っ盛りのタイミングだったんですよね。(メーカー端末によって時期が違いますが)
とにかく、文字エンコードがUTF-8になった時に、Webエンジニアのこれまでの文字エンコードトラブルが無くなったため、かなり嬉しかったことも昨日のように覚えています。
文字エンコード一括変換
サイトの文字エンコードを一括で変換するのは実はあまりオススメしません。
何故なら、システムでの文字エンコードを扱うモジュールが実装されていると、確実にエラーが起きるからです。
高確率で言い切れるのは、2バイト文字を使っていない(継承していない)場合は、ソースの文字エンコードは何でも良いので変換しても問題ないんですよね。
それか、ちゃんと自動テストを作って、文字コード返還をした後で、テストが通らない箇所を手直しするというやり方もあります。
いろいろなリカバリー方法を考えながら、複数のファイルを一括で変換するためには、次のコマンドで簡単にできます。
bash
find ./ -name "*.php" -print0 | while IFS= read -r -d '' file; do
iconv -f EUC-JP -t UTF-8 "$file" -o "${file}.utf8" && mv "${file}.utf8" "$file"
done
ちなみに、macで実行する場合は、以下のコマンド
find . -name "*.php" -print0 | while IFS= read -r -d '' file; do
iconv -f EUC-JP -t UTF-8 "$file" > "$file.tmp" && mv "$file.tmp" "$file"
done
*.phpは、phpファイルをコンバートした名残なので、好きな拡張子に書き換えて一括変換してください。
残念ながら、vscodeには、標準で単一ファイルの文字エンコードは切り替える事はできますが、複数ファイルの一括変換ができる機能がありませんでした。
(プラグインを作ろうとも思ったけど、利用頻度が低すぎるのでやめました)
ちなみに、正常に動かない場合は、iconvをインストールすることで使えるようになります。
あとがき
今回は、15年以上リファクタリングをほったらかしにしていた会社での開発の手伝いをした話をしたんですが、
開発コストを正常に見積もれない自転車操業を行っている会社の経営者に一言いいたいのは、
IT企業であれば、事業計画と同時に、システム保守コストもちゃんと計画しないと、とんでもない技術負債を抱え込んで、それはエンジニアじゃないと気がつかない領域なので、とんでもない経営負債を抱え込んでしまう事になりますよ。
エンジニア知識の乏しい経営者は、こうした認識や判断をエンジニアに託すしかないのですが、優秀な腕利エンジニアが社内にいる(または、取引先にいる)場合は問題ないけど、いない場合は今一度コンサルティングなどに話を聞いてみる事をオススメします。
とにかく、今の時代に文字エンコード問題でエンジニアを引き摺り回すのは、やめてほしいという、一エンジニアの切なる願いでもありました。
0 件のコメント:
コメントを投稿