SJISのコード表をUTF8に変換する

jitte2007-12-02


波ダッシュ問題とかで気になったので確認してみることにする。

まず、検証用のhtmlを作ってみた。

UPPER = (0x81..0x9F).to_a + (0xE0..0xFC).to_a
LOWER = (0x40..0x7E).to_a + (0x80..0xFC).to_a

HEADER = <<_EOF_
<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
    <table>
_EOF_

FOOTER = <<_EOF_
    </table>
  </body>
</html>
_EOF_

print HEADER
puts "<tr><td></td>" + (UPPER.map do |c| "<td>%02X</td>" % c end.join) + "</tr>"
LOWER.each do |l|
  printf "<tr><td>0x%x</td>", l
  UPPER.each do |u|
    printf "<td>%c%c</td>", u, l
  end
  puts "</tr>"
end
print FOOTER

んで、これをUTF8に変換するのだが、ここではPHPのmb_convert_encodingを使ってみた。

<?php
  $buf = file("sjis.html");
  foreach($buf as $line) {
    print mb_convert_encoding($line, 'utf8', 'sjis-win');
  }
?>

ここで、第3引数のsjis-winは、波ダッシュをちゃんと変換してくれるらしい。

画像は、変換後のhtmlをSafariで表示させたもの。ざっと見たところ、波ダッシュ、丸数字、ローマ数字とかも含め、完璧っぽい。