HTMLファイル(静的)をShellで一気に文字コード変換

2006年12月11日 オフ 投稿者: KYO
Table of Contents

Web系の開発をやっていると、どうしてもぶち当たるLinux系サーバーとIISサーバーでの文字コードの違い。
さらには、ブラウザによっての文字コード対応状況の違い。特に、PCとモバイル。
PCでは、SJIS・EUC・UTF-8はほとんどサポート済みなんですけど、モバイルではEUCやUTF-8が使えなかったりします。
そこで、サーバー上の静的なHTMLファイルを一括して文字コード変換を行うShell。
どこかのサイトで見かけて参考にさせて頂いたんですけど、これは結構便利。
というわけで・・・・こちらへもメモx2。


まずは、以下のShellを作成。
※1行目のパスは使用しているサーバーへ一致させること!
※Shell内部で [ nkf ]を使用しているので、nkfをインストールするのが条件
※サブディレクトリへの再帰的な文字コード変換には多分、未対応

EUC-JP⇒Shift-JISへの文字コード変換
$vim euc2sjis.sh
#! /bin/sh
test -z "$1" && echo "Usage: htmlconv-sjis <directory>" && exit
cd "$1"
# HTMLファイルの文字コードを変換する.
find . -maxdepth 1 -type f -name '*.html' | while read html; do
echo "$html"  # 進行状況を表示
# eucに変換
tmpfile=`basename "$html" .html`$$.html
nkf -s -Lw $html > $tmpfile
mv "$tmpfile" "$html"
done
# HTMLファイルのヘッダを書き換える.
find . -maxdepth 1 -type f -name '*.html' | while read html; do
# perlで置換
perl -i -p0777e "s/(<meta\s.*?charset=)\w.*(['\"])/\$1Shift_JIS\$2/gi" "$html"
done
Shift-JISからEUC-JPへの文字コード変換
$vim sjis2euc.sh
#! /bin/sh
test -z "$1" && echo "Usage: htmlconv-euc <directory>" && exit
cd "$1"
# HTMLファイルの文字コードを変換する.
find . -maxdepth 1 -type f -name '*.html' | while read html; do
echo "$html"  # 進行状況を表示
# eucに変換
tmpfile=`basename "$html" .html`$$.html
nkf -e -Lu $html > $tmpfile
mv "$tmpfile" "$html"
done
# HTMLファイルのヘッダを書き換える.
find . -maxdepth 1 -type f -name '*.html' | while read html; do
# perlで置換
perl -i -p0777e "s/(<meta\s.*?charset=)\w.*(['\"])/\$1EUC-JP\$2/gi" "$html"
おまけ::ファイル内のリンクの拡張子変更( [ .htm ] ⇒ [ .html ] )
$vim htm2html.sh
#! /bin/sh
test -z "$1" && echo "Usage: htm2html <directory>" && exit
cd "$1"
# .htm を .html に変換する
find . -maxdepth 1 -type f -name '*.htm' | while read htm; do
echo "$htm"  # 進行状況を表示
mv "$htm" `basename "$htm" .htm`.html
done
# HTMLファイルの内容を書き換える
find . -maxdepth 1 -type f -name '*.html' | while read html; do
# HTMLファイルの内容をperlで置換
perl -i -p0777e "s/(<*\s.*?)(src=|href=)(['\"]?)(.*?).html*/\$1\$2\$3\$4.html/gi" "$html"
done

実行方法
※各Shellのファイルパスが[ ~/sh ]以下の場合

sh ~/sh/sjis2euc.sh <<変換するHTMLファイルまでのパス>>
sh ~/sh/euc2sjis.sh <<変換するHTMLファイルまでのパス>>
sh ~/sh/htm2html.sh <<変換するHTMLファイルまでのパス>>