Pukiwiki 1.4.5_1 (EUC)を Pukiwiki 1.5.0(UTF-8)に更新したときのメモ (2021/4)

研究室で使ってるpukiwikiが突如真っ白

かなり昔から使っていたのですが表示ができなくなり更新しました.文字列がEUCで作成していたのでUTF-8にする必要があります.かなり苦労したので少しメモを残しておきます.web上の記述もほとんどないですね.(3ヶ月前に行ったときの記憶で書くので少し違うかも知れません)

やること

  1. pukiwiki1.4.5_1を pukiwiki1.5.0に更新
  2. EUCで書かれている部分を全部 UTF-8にする (これがホントに大変)

(ただし attacheの部分はできていません.更新の際に捨てました)

新規pukiwiki1.5.0のインストール

これはほとんど問題なし.公式を参考にdowload先から utf8版のpukiwiki1.5.0を選択してdownload./var/wwwなど htmlを展開しているところに置くとまずすぐ動いた.

旧pukiwiki (EUCで書かれている) を文字列を変更して移行

/var/www などの下でおいている pukiwiki/ 以下のバックアップをとる

基本的にattach、backup、cache、counter、diff、wiki の以下のファイルをpukiwiki1.5.0と同じ場所に置くと良い.ただし,ファイル名がDEC9CDF8.txtなどとencodeされていて,これが全部EUCになっているものをUTF-8にしないと表示されない...

encs.phpを使って各EUCエンコードされたファイル名(中身もEUC)のものはUTF-8エンコードしたファイル名(中身はEUCのまま)に変換する

まずencls.phpというものをdownload(公式のどこかに指示がありました).しかし使い方に説明無し.これは 1) 指定したディレクトリについて 2) 指定した suffixのファイルを (.txt) を読み込んで 3)指定した文字エンコードにencodeした名前を stdoudに出力するだけです.なので実行しても基本的になにも変化がありません.

そこでencs.phpを下記のように書き換えました(一部表示).やっていることは1)指定のディレクトリのファイル.suffixを読み込んで 新規に サブディレクトリ tmp/の下に UTF-8のファイル名でファイルをコピーしたものを作るというものです.wikiのデイレクトリがだいたい本体で.txtだけですが cache (pukiwikiだと左側の更新リストで表示されるところ)が .refとかあるので,それぞれのデイレクトリで少しずつ実行して UTF-8のタイトルに変更した(かつ中身の文字列もEUCからUTF-8)ファイルを作成します.

// Do
mb_internal_encoding(SOURCE_ENCODING);
mb_detect_order('auto');
$write_dir = './tmp/';   //これ加えた
$matches = array();
foreach ($argv as $arg) {
        if (preg_match('/^(.+)(\.[a-zA-Z0-9]+)$/', $arg, $matches)) {
                $name   = $matches[1];
                $suffix = $matches[2];
        } else {
                $name   = $arg;
                $suffix = '';
        }
        //echo $name . $suffix . "\n";          // As-is
        if ($f_decode) {
                // Decord
                echo decode($name) . $suffix . "\n";
        } else {
                // Decord -> convert -> encode
                echo encode(mb_convert_encoding(decode($name),
                        TARGET_ENCODING, SOURCE_ENCODING)) .
                        $suffix . "\n";
                // copy files with new names  <<<< ここを書き換えている.ここから copyまで
                $euc_f_name = $name . $suffix ;
                $utf8_f_name = $write_dir . encode(mb_convert_encoding(decode($name), 
                        TARGET_ENCODING, SOURCE_ENCODING)) .
                        $suffix;
                copy($euc_f_name,$utf8_f_name);
        }
        //echo "\n";
}

上記の部分は単に tmpファイルに ファイル名をUTF-8に変換するだけです.

まず自分のpukiwikiの全体をコピー作業用puwkiwkiを /home/jibun/old_pukiwikiとして, wikiのディレクトリについて作業するとします.
先に,/home/jibun/old_pukiwiki/wiki/tmp を作成しておきます

mkdir /home/jibun/old_pukiwiki/wiki/tmp

それで下記のように実行します

cd /home/jibun/old_pukiwiki/wiki
php (enc.phpへのパス)/encls.php --all 

すると /home/jibun/old_pukiwiki/wiki/tmp の下に utf-8名になったファイルがコピーされます (中身の文字はEUCのまま).

次に, /home/jibun/old_pukiwiki/wiki/tmp の下のファイルの中身をEUCから UTF-8に変更します.
nkfを使いました.CentOS7上では下記のように実行しました.

cd /home/jibun/old_pukiwiki/wiki/tmp
find . -type f -print0 | xargs -0 -n 256 nkf --overwrite -w -Lu 

この内容を pukiwiki1.5.0の wikiの下にコピーすると見えます.他のディレクトリも同様です.

cacheの変換

cacheディレクトリの場合は他のタイプのファイルもあるのでそれも変換します.

mkdir /home/jibun/old_pukiwiki/cache/tmp
cd /home/jibun/old_pukiwiki/cache/
php (enc.phpへのパス)/encls.php --suffix='.ref' --all
php (enc.phpへのパス)/encls.php --suffix='.rel' --all

これとファイル名がautolink.datなど英語表記で変換しないものもあるのでそれはコピーします.

cp *.dat tmp/
cp *.html tmp/

このあと中身をutf-8にします

cd /home/jibun/old_pukiwiki/cache/tmp 
find . -type f -print0 | xargs -0 -n 256 nkf --overwrite -w -Lu

cache/tmpの内容を 新規  pukiwiki1.5.0の cacheの下に置くと左側に履歴がでると思います

あとのbackupなどはほとんど使って無かったので変換しましたが確認していません.
あと,attacheですが,ファイル名との関係が複雑で (attacheファイルが windowsの shift-jisのテキストなどいろいろあり,また何番目のファイルがattacheされていかなど管理されているのですが,そこを復元するのが難しいそうなのでしませんでした.