人の名前にちなんで名付けられたファイルがたくさんありますが (例: "john.txt"、"mary.txt")、その中には日本語の名前 (例: "fūka.txt"、"tetsuro.txt") もあります。
私がやろうとしているのは、「.txt」の前の名前をBase64に変換することです。
唯一の問題は、ファイル名 (拡張子なし) を使用して Web ベースのコンバーターを使用すると、Python スクリプトを使用してエンコードする場合とは異なる結果が得られることです。
ということで…例えばhttp://www.base64encode.orgでファイル名の部分を拡張子なしでコピーして「風花」をエンコードすると「 ZsWra2E=」となる。UTF-8でエンコードされたPostgreSQLデータベースから人の名前を取得し、小文字にしてbase64でエンコードした場合と同じ結果が得られます。
しかし、以下のPythonスクリプトを使用すると、「ZnXMhGth」が表示されます
import glob, os
import base64
def rename(dir, pattern):
for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
t = title.lower().encode("utf-8")
encoded_string = base64.b64encode(t) + ext
p = os.path.join(dir, encoded_string)
os.rename(pathAndFilename, p)
rename(u'./test', u'*.txt')
OS X 10.8 と Linux (Mac から Linux サーバーにアップロードされたファイル) で同じ結果が得られます。Python は 2.7 です。また、PHP スクリプトも試してみました (結果は Python スクリプトの場合と同じでした)。
また、他の文字 (「tetsuro」など) で名前を使用した場合にも、同様の違いが生じます。
もう1つ奇妙なこと... OS XのターミナルアプリケーションでPythonスクリプトを使用してファイル名部分を出力し、このテキストをファイル名としてコピーすると...そしてファイル名をbase64にエンコードすると、Webページと同じ結果が得られますI上記の通り。端末には UTF-8 エンコーディングがあります。
誰かが私が何をしている(または考えている)間違っているのか説明してもらえますか?少し文字の置換が行われている間にどこかありますか? Python スクリプトで上記の Web ページと同じ結果が得られるようにするにはどうすればよいですか? ヒントをいただければ幸いです。
解決:
マークの回答の助けを借りて、スクリプトを変更したところ、魅力的に機能しました! ありがとうマーク!
import glob, os
import base64
from unicodedata import normalize
def rename(dir, pattern):
for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))
t = normalize('NFC', title.lower()).encode("utf-8") # <-- NORMALIZE !!!
encoded_string = base64.b64encode(t) + ext
p = os.path.join(dir, encoded_string)
os.rename(pathAndFilename, p)
rename(u'./test', u'*.txt')