PerlでHTMLファイルのmetaタグを読んで文字コードを判定する処理を書いてみた
300個以上の静的htmlファイル内のリンクを一括で置き換える事案に遭遇。単純に置き換えすると文字化けする。なぜなら、shift-jisとutf-8が混在しているから。ファイルの編集者が別なので、文字コードを統一することはできない。ということで、Perlの出番です!
HTMLのheader内にcharsetの定義はされているので、そこを読み込んで文字コードを判定する処理を書いてみました。
File::Slurp::read_file() でファイル読み込みするのがマイブームです。
#!/usr/bin/env perl use strict; use warnings; use utf8; use feature qw/say/; use File::Slurp qw/read_file/; # .html と .htm が混在してるので、両方拾う my @html_files = glob "*.html *.htm"; foreach (@html_files) { my $text = read_file($_); my $charset = "unknown"; if ($text =~ /charset="UTF-8"/i){ $charset = "UTF8"; } elsif ($text =~ /charset=shift_jis"/i){ $charset = "Shift-JIS"; } say $_, " => ", $charset; }
実行してみる
↑ こんな感じのフォルダで実行してみます。
↑ 期待通り、文字コードを判定して表示できてますね。
前処理として文字コード判定してから、「読み込み→デコード→置き換え→エンコード→書き出し」することで文字化けすることなくタスクを完了しました。
退屈なことはPerlにやらせよう!