2012-02-29 12 views
5

間で異なるオープン()Unicodeのファイル名の挙動:Pythonのように見えるファイル名でのOS

filename = u"/direc/tories/español.jpg" 

また、オープン使用して()のように:

fp = open(filename, "rb") 

これは正しくOSX上のファイルを開きます(10.7 )、Ubuntu 11.04ではopen()関数がu"espa\xf1ol.jpg"を開こうとしますが、これはIOErrorで失敗します。

両方のシステムでsys.getfilesystemencoding()を確認しましたが、どちらもutf-8に設定されています(ただし、Ubuntuでは大文字、つまりUTF-8が該当するかどうかはわかりません)。私はまた、# -*- coding: utf-8 -*-をpythonファイルに設定しましたが、これはファイル内のエンコーディング、外部関数ではないエンコーディング、またはpythonがシステムリソースを扱う方法にのみ影響します。ファイルは両方のシステムに存在し、eñeが正しく表示されます。

最終的な質問は:español.jpgファイルをUbuntuシステムで開くにはどうすればよいですか?

編集: español.jpg文字列が実際にDjangoのORM(ImageFileField)を介してデータベースから出てきているが、私はそれに対処し、動作の違いを見ている時間によって、私は絶対的である、単一のUnicode文字列を持っていますファイルへのパス。

+1

「\ xf1」は、ISO-8859-1の '' '' 'の表現です。 –

+3

参考までに、私は 'español.jpg'という名前のファイルに触れ、あなたの方法でそれを開き、私のアーチLinuxで正しく動作しました。あなたのUbuntuの 'locale'出力を貼り付けることができますか? –

+0

'locale'は' LANG'を含む多くのパラメータに対して 'en_US.UTF-8'を与えます。 – mrmagooey

答えて

2

以下この1つは両方のケースで動作するはずです:

fp = open(filename.encode(sys.getfilesystemencoding()), "rb") 
+0

'sys.getfilesystemencoding'は少し嘘です:多くのプラットフォーム(私はあなたを見ていますが、UNIX)では、ファイルシステムにはエンコーディングはありませんが、バイトだけです。ファイルシステムではなく、アプリケーションは、ファイル名がテキストである場合、ファイル名を表すために使用されるエンコーディングを定義します。 –

+2

'getfilesystemencoding'は実際にファイルシステムのエンコーディング(UTF-16)を報告しないので、これはWindowsでは動作しません。プラットフォームに依存しないことを望むなら、これを行うべきではありません。 – Philipp

+1

しかし、Windowsのファイルシステムを正しく処理する 'getfilesystemencoding'を使って' mbcs'をウィンドウに表示しています。 –

1

それは単にあなたのファイルの先頭にファイルのエンコーディングを設定するには十分ではありません。エディタで同じエンコードを使用していることを確認し、そのエンコードにテキストを保存してください。必要に応じて、アスキー文字以外の文字を再入力して、エディタが正しいことを行うようにします。

データベースにアクセスするには、ラインに沿ったどこも非ユニコードとしてエンコードされていないことを確認する必要があります。

+1

+1これはエディタの設定を確認してください。 –

+0

申し訳ありませんが、私はエディタのエンコーディングの問題を否定するはずだと思う最初から編集情報を追加したはずです...? – mrmagooey

+0

@mrmagooey:はい、でも、文字列を別の方法でエンコードしていないことを確認する必要があります。 – Marcin

関連する問題