pukiwikiではファイルアップロードをattachプラグイン経由で実行可能になっている。
attachでアップロードしたファイルは、index.phpがあるディレクトリの、attach
ディレクトリ以下に次のようなファイルとして保存される。
A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466.log* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466.log*
これらは何かというと、pukiwikiが使う文字コードをさらにURIエンコードしたものになつている。 これだとパット見でpdfなのかpptなのかjpgなのか判断できないため、utf8ベースのファイル名に変換したい。
今回はeuc-jpの文字コードが使われていたので、decodeしてutf8に変換するやつを書いた
#!/usr/bin/env perl use strict; use warnings; use utf8; use Encode qw/decode encode_utf8/; while (my $file = <*>) { chomp $file; $file =~ s/\*//; my $ufile = $file; $ufile =~s/([0-9A-F]{2})/chr(hex($1))/ge; $ufile = decode('euc-jp', $ufile); $ufile = encode_utf8 $ufile; print "mv $file $ufile\n"; system("mv", $file, $ufile); }
このperlをattachディレクトリに置いて実行するといい感じにしてくれる。
mv A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466 デジタル信号処理/中間テスト_DSPMid'00_Solution.pdf mv A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466.log デジタル信号処理/中間テスト_DSPMid'00_Solution.pdf.log mv A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466 デジタル信号処理/中間テスト_DSPMid'01_Solution.pdf mv A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466.log デジタル信号処理/中間テスト_DSPMid'01_Solution.pdf.log
こんな感じのコマンドが実行されたことになる。いいですね。
なおこれだと自分のプログラムも置換しにいくので、実際は__DATA__
以下に変換したいファイル名を書いて実行した。
#!/usr/bin/env perl use strict; use warnings; use utf8; use Encode qw/decode encode_utf8/; while (my $file = <DATA>) { chomp $file; $file =~ s/\*//; my $ufile = $file; $ufile =~s/([0-9A-F]{2})/chr(hex($1))/ge; $ufile = decode('euc-jp', $ufile); $ufile = encode_utf8 $ufile; print "mv $file $ufile \n"; } __DATA__ A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730305F536F6C7574696F6E2E706466.log* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466* A5C7A5B8A5BFA5EBBFAEB9E6BDE8CDFD2FC3E6B4D6A5C6A5B9A5C8_4453504D69642730315F536F6C7574696F6E2E706466.log*