3

私のファイルはUS-ASCIIであり、のようなコマンドa = file( 'main.html')a.read()ASCIIテキストとしてロードします。UTF8としてロードするにはどうすればよいですか?

私が解決しようとしている問題は次のとおりです。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 38: ordinal not in range(128)

のように、ファイルの内容をテンプレートに使用していましたtemplate_str.format(attrib=val)。ただし、補間する文字列はASCIIのスーパーセットです。

私たちのチームのバージョン管理とテキストエディタは、エンコーディングを気にしません。では、コードでそれをどのように処理しますか?

4

3 に答える 3

6

エンコーディングを指定せずにファイルを開こうとしています。つまり、Pythonはデフォルト値(ASCII)を使用します。

.decode()次の関数を使用して、バイト文字列を明示的にデコードする必要があります。

 template_str = template_str.decode('utf8')

valテンプレートに補間しようとした変数はそれ自体がUnicode値であり、Pythonはバイト文字列テンプレート(ファイルから読み取ったもの)も自動的にUnicode値に変換して、両方を組み合わせることができるようにします。そのためのデフォルトのエンコーディング。

UnicodeとPythonUnicodeHOWTOに関するJoelSpolskyの記事を読む必要があることはすでに述べましたか?ここで何が起こったのかを理解するのに役立ちます。

于 2012-09-11T14:09:10.803 に答える
6

Python2で動作するソリューション:

import codecs
fo = codecs.open('filename.txt', 'r', 'ascii')
content = fo.read()  ## returns unicode
assert type(content) == unicode
fo.close()

utf8_content = content.encode('utf-8')
assert type(utf8_content) == str
于 2012-09-11T14:00:30.133 に答える
1

ファイルがASCIIでエンコードされていることは確かだと思います。あなたは?:) ASCIIはUTF-8に含まれているため、問題を予期せずにUTF-8を使用してこのデータをデコードできます。ただし、データがASCIIだけであることが確実な場合は、UTF-8ではなくASCIIのみを使用してデータをデコードする必要があります。

「UTF8としてロードするにはどうすればよいですか?」

「Unicodeとしてロードするにはどうすればよいですか?」という意味だと思います。ASCIIコーデックを使用してデータをデコードするだけで、Python 2.xでは、結果のデータはタイプになりunicodeます。Python 3では、結果のデータはタイプになりますstr

Pythonでこの種のデコードを実行する方法を学ぶには、このトピックについて読む必要があります。一度理解すれば、それは非常に簡単です。

于 2012-09-11T13:56:04.783 に答える