Perl楽しいから好き

Perlをはじめとしたプログラミング周りのあれこれについて。モダーンなPerlを楽しんでいます。

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;
}

実行してみる

f:id:perl48:20180909162552p:plain

↑ こんな感じのフォルダで実行してみます。

f:id:perl48:20180909162630p:plain

↑ 期待通り、文字コードを判定して表示できてますね。


前処理として文字コード判定してから、「読み込み→デコード→置き換え→エンコード→書き出し」することで文字化けすることなくタスクを完了しました。


退屈なことはPerlにやらせよう!