pukiwikiのattachファイルをutf8なファイル名に変換する

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*