FTPでアップロードしたファイルの文字コード
WindowsのFFFTPからアップロードしたファイルが、日本語名が使われている場合、大体はsjis(cp932)です。稀に、utf8を使って下さる女神のようなお方がおりますが、滅多にいないと思う。
んで、サーバ側のファイル名の文字コードを変更するPythonプログラム。*1
指定したディレクトリー以下のファイルやディレクトリーの、ファイル名の文字コードをチェックして、強制的にutf8に変更する。
#!/usr/bin/env python2.5 import dircache import os import sys quiet_flag = False __DEBUG = False # # name = get_jp_encoding_name(msg[,char_code]) # name is msg encoding type name. # This only check the Japanese. # def get_jp_encoding_name (msg,char_code = 'iso-2022-jp'): import types enc_name = char_code or 'iso-2022-jp' check_type = ['utf_8', enc_name, 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_2004','iso2022_jp_3', 'iso2022_jp_ext', 'cp932', 'shift-jis', 'shift_jis_2004', 'shift_jisx0213', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213'] for enc in check_type: try: if isinstance(msg, types.StringType): s = msg.decode(enc) else: s = unicode(msg,enc) except : continue return enc return None def trace (path): if not quiet_flag: print path files = dircache.listdir(path) for file in files: encode = get_jp_encoding_name(file,'ascii') encode_msg = '' if encode != 'utf_8': newfile = file.decode(encode).encode('utf_8') os.rename(path+'/'+file, path+'/'+newfile) encode_msg = 'encode for utf_8' file = newfile if not quiet_flag or (quiet_flag and encode_msg != ""): print file, " is ", encode , " ", encode_msg if (os.path.isdir(path+'/'+file)) : trace(path+'/'+file) if __name__ == '__main__': _p = '.' if len(sys.argv)>2: quiet_flag = True _p = sys.argv[2] elif len(sys.argv)>1: _p = sys.argv[1] path = os.path.abspath(_p + "/") if __DEBUG : print "quiet flag:", quiet_flag, " path:",path if os.path.exists(path) : trace(path)
*1:サーバがsjisで何が困るって、AFP使ってる私にとっては頭痛い話なので…バックアップ取った時に、sjisとutf8が混在するのよね…