sjisからutf8に変換

概要

  • 青空文庫のテキストファイル、HTMLファイルの文字コードをSJISからUTF8に変換します。
  • SJISにないため記号や画像として埋め込まれている漢字で文字として取り込めるものは取り込みます。

前準備

  • Windowsパソコンにrubyをインストール
  • バッチファイルとaozora_gaiji.txtを同じフォルダに準備
  • 変換したい青空文庫のテキストファイル、HTMLファイルをそのフォルダ以下に準備しておく
REM SJISからUTF8に変換.bat

ruby -x "%~f0"
goto end

#!ruby
#encoding: utf-8
Encoding.default_external = 'UTF-8'

$stdout=open("tmp.log","w")
$stderr=open("err.log","w")
require 'fileutils'

h=open(__dir__+"/aozora_gaiji.txt").readlines.
  map{|e|e.chomp.split(/(?<!,),/)}.to_h
h.transform_keys!{|k| k.split("-").map{|f|f.to_i}}

Dir.glob('**/*.{txt,html}'){|f|
  next if /aozora_gaiji.txt$/=~f
  ar,s=[],""
  puts f+":"
  begin
    s=open(f).read.encode(Encoding::UTF_8,Encoding::SJIS).
      gsub(/charset=Shift_JIS/i,"charset=utf-8").
      gsub(%r!(※[#[^[]]*])|<img [^<>]+※[^<>]+"gaiji" />!){|e|
        if /((\d)-(\d+)-(\d+))/=~e
          n=$1.split("-").map{|k| k.to_i}
          s=e.gsub(%r|.*(※\([^()]*\)).*|,"\\1")
          e=h[n] if h[n]
          s=e+" => "+s
          ar << s
        end
        e}
    FileUtils.cp(__dir__+"/"+f,__dir__+"/"+f+"~")
    File.write(f,"\uFEFF"+s)
    ar.uniq.each{|e| puts e}
  rescue
    next
  end
  puts ""
}
__END__
:end

使い方

  • バッチファイルをダブルクリックして実行すると変換が実行されます
  • 末尾に「~」がついたファイルが元のファイルのバックアップとして作成されます
  • 変換した埋め込み文字の一覧をtmp.logで確認できます

コメント