Ruby/Pukiwiki のファイル名をUTF8に変換する

Ruby/Pukiwiki のファイル名をUTF8に変換する

Dokuwiki のバージョンを上げたら、PHP5.3 では動作しなくなって、PHP5.6に上げたら、Pukiwiki が死亡したため、これをどうにかしないといけないことになったため。

Pukiwiki 1.5.1 には UTF8 バージョンがあるようなのでコレを使おう。

古い Pukiwiki のページタイトルはデータとして管理されておらず、wiki ディレクトリ以下にページタイトルを EUC-JP エンコードしたものをさらに16進表記に変換したファイル名で保存される。

なのでこの読めない16進の並びをバイト列に戻してやって、EUC-JP として解釈させ、それをさらに UTF8 に変換すればよい。 変換後これをさらに16進表記に変換すれば UTF8 版の Pukiwiki で使えるようになるだろう。

ということでこうなる

puts ["416E64726F6964A1CAB3ABC8AFA1CB2FB3ABC8AFBCEABDE72FB2E8CCCCA4CEC4C9B2C3"].pack("H*").encode("utf-8", "euc-jp")

これをやると「Android(開発)/開発手順/画面の追加」と出るはずだ。

配列の pack 関数を使って、16進と解釈させてバイナリに変換してそれを euc-jp として解釈したものを utf-8 に変換している。

puts ["41....C3"].pack("H*").encode("utf-8", "euc-jp")

つまり pack の時点で euc-jp のバイナリに戻っている。なのでコンソールに表示すると一部文字化けて表示はされるはず。 これはコンソールの文字コード設定が euc-jp になっていないため。

なのでリダイレクトでファイルにブチ込み、それなりのエディタで開くと euc-jp として解釈されて表示されるはず。

$ ruby hoge.rb > hoge.txt

こいつをさらに unpack すれば UTF8 版の pukiwiki で使えるファイル名になる。

puts ["41....C3"].pack("H*").encode("utf-8", "euc-jp").unpack("H*")

このようになるはずだ。

416e64726f6964efbc88e9968be799baefbc892fe9968be799bae6898be9a0862fe794bbe99da2e381aee8bfbde58aa0

416e64726f6964 までが同じになっているのはここまでが「Android」を表すわけでアスキーコードなのでUTF8でもEUCでも同じバイナリというわけである。

ruby/etc/convert_pukiwiki_file_name_to_utf8.txt · 最終更新: 2021-06-25 12:39 by ore