2011-11-13 11 views
3

ISO-8859-1/Latin-1文字セットを扱うとき、私はPythonで膨大なエンコーディングの問題に直面しています。Python ISO-8859-1エンコーディング

os.listdirを使用してフォルダの内容を取得すると、ISO-8859-1(例: 'Ol \ xe1 Mundo' ')でエンコードされた文字列が得られますが、Pythonインタプリタでは同じ文字列がエンコードされます

In : 'Olá Mundo'.decode('latin-1') 
Out: u'Ol\xa0 Mundo' 

文字列を同じ形式にデコードするにはどうすればよいですか。

http://en.wikipedia.org/wiki/ISO/IEC_8859-1

:私は os.listdirが正しくエンコードされた文字列を返していることを見てきましたが、インタプリタではありません(「A」の文字は、ないに「\ XA0」ISO-8859-1では「\ XE1」に対応します)

どのように克服するための考えですか?

+0

'os.listdir()'はバイトを返します。ファイルに名前を付けたプロセスは、ファイルにiso-8859-1で特定の解釈を持つ名前を付けるように選択しました。ファイル名はBIG-5やJISに簡単に格納でき、 'os.listdir()'は気にしません。 – sarnold

+0

@sarnold: 'os.listdir()'は文字列やバイトを返すことができます。渡す内容とディレクトリの内容に依存します。 – Thanatos

答えて

3

非Unicode文字列リテラルをpython2対話型セッションで入力すると、システムのデフォルトのエンコーディングが引き継がれます。

あなたがWindowsを使用していること、およびデフォルトのエンコードがゆえであることが表示されますおそらく「CP850」または「CP437」:

C:\>python 
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.stdin.encoding 
'cp850' 
>>> 'Olá Mundo' 
'Ol\xa0 Mundo' 
>>> u'Olá Mundo'.encode('cp850') 
'Ol\xa0 Mundo' 

あなたはほぼ同等である1252へのコード・ページを(変更した場合latin1)、文字列は期待通りに表示されます:

C:\>chcp 1252 
Active code page: 1252 

C:\>python 
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.stdin.encoding 
'cp1252' 
>>> 'Olá Mundo' 
'Ol\xe1 Mundo' 
関連する問題