2

人の名前にちなんで名付けられたファイルがたくさんありますが (例: "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')
4

1 に答える 1

0

Python スクリプトは、正規化された形式の Unicode を使用しているように見えます。ここでは、ūが 2 つの文字に分割され、マクロンが組み合わさuれています。もう 1 つの形式では、1 文字のラテン小文字とマクロンを使用します。Unicode に関する限り、バイナリ表現は同じではありませんが、同じ文字列です。u

この Unicode FAQ からさらに情報が得られるかもしれません: http://www.unicode.org/faq/normalization.html

于 2013-02-22T16:22:06.223 に答える