5

次のエラーが表示されます。

UnicodeEncodeError: 'ascii' コーデックは位置 52-57 の文字をエンコードできません: 序数が範囲外です (128)

エラーの原因となっているコード:

f.write(textwrap.dedent(unicode(the_string))

私が書こうとしている文字列は、英語と日本語を含むウェブサイトからの抜粋です (テスト用) (帰化した一部の外国借入金は、カタカナ表記ができない場合があります。)

他言語(日本語)のPythonで文字列を扱う場合。これを解析してエラーを防ぎ、文字列を保持するにはどうすればよいですか?

4

3 に答える 3

4

ここでの問題は.write、ファイル オブジェクトのメソッドがナイーブに Unicode 文字列を変換しようとしていることです (Python 2.x を使用している場合、これはunicode型になります)。それをバイト文字列 (Python を使用している場合) に渡します。 2.x、これはstrASCII コーデックを使用するタイプになりますが、渡す Unicode 文字列は ASCII を使用して表すことができません。これは、ASCII 文字セットの一部ではない (日本語の) 文字が含まれているためです。

保存する前に、Unicode 文字列のメソッドを使用して、.encodeその文字列を表す一連のバイトに変換する必要があります。これは基本的strに、Python 2.x で型が表すものです。単なる一連のバイトであり、予想されるような一連の文字ではありません。printただし、Python は、 type の変数をstr使用すると、システムのデフォルトの Unicode エンコーディングを使用して、端末に一連の文字として表示されるため、別の考え方を簡単にさせることができます。

ここで文字列をエンコードするためにどのエンコーディングを使用する必要があるかは、ユースケースによって異なります。UTF-8 が最も一般的であり、単純にそれを使用したい場合もありますが、書き込んでいるファイルが同じシステムのテキスト エディターで正しく表示されることを確認したい場合は、UTF-8 を備えたデバイスで実行した場合でも同様です。 UTF-16 のような一般的ではないシステム エンコーディングの代わりに、システムのデフォルト エンコーディングを使用することもできます (文字列をエンコードできないデフォルト エンコーディングがシステムにある場合は、もちろん失敗します)。

つまり、ほぼ確実に、次のいずれかを実行する必要があります。

a)

f.write(textwrap.dedent(the_string).encode('utf-8'))

b)

import sys
f.write(textwrap.dedent(the_string).encode(sys.getdefaultencoding()))

非 ASCII テキストをファイルに書き込むというかなり基本的なタスクを実行するために頭を悩ませるのは、かなり面倒で複雑な作業だと思われる場合は、同意します。初めてのプログラミング言語である Python を使い始めたとき、Unicode、文字列エンコーディング、それに関連する Python の型とメソッドを理解するのに苦労しましたただし、この複雑さは Python のせいではありません。コンピューターがテキストをエンコードする方法、特にテキストには複数のエンコーディングが存在するという事実が原因です。異なる一連のバイトが同じ一連の文字を表すことができる、使用されているエンコーディングに応じて。これにより、Python が文字列エンコーディングの要点をあなたから隠して、初心者の私が素朴に望んで期待していたように「自動的に適切なことを行う」ことができなくなります。

ASCII 以外の文字を含む可能性のあるテキスト データを Web から取得して使用することを含む大量のコードを作成する場合は、このトピックを徹底的に読み、十分に理解することをお勧めします。一般的および Python 固有のパースペクティブ。

于 2012-11-21T20:23:43.807 に答える
2

次のように、Unicode文字列を使用してみることができます。

jstring =u"桜花びらざ"

これを参照してください:http://docs.python.org/tutorial/introduction.html#unicode-strings

于 2012-11-21T19:01:50.350 に答える
0

別の言語 (またはエンコーディング) を使用してファイルに書き込むときに、文字列変数の末尾に.encode. 例えば:

f.write( the_string.encode('utf-8') )
于 2012-11-21T20:17:00.350 に答える