2

UTF8 エンコーディングの CSV ファイルを読み込んでいます。

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    print repr(row[0])

これは問題なく動作し、期待どおりに出力されます。UTF8 でエンコードされたstr:

> '\xc3\x81lvaro Salazar'
> '\xc3\x89lodie Yung'
...

strさらに、 (とは対照的に)を単に印刷するとrepr()、出力は問題なく表示されます(どちらにしてもわかりません-これはエラーを引き起こすべきではありませんか?):

> Álvaro Salazar
> Élodie Yung

しかし、エンコードされたUTF8を次のように変換しようとするstrsunicode:

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    print unicode(name, 'utf-8')  # or name.decode('utf-8')

私は悪名高い:

Traceback (most recent call last):                                       
File "scripts/script.py", line 33, in <module>
    print unicode(fullname, 'utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)

そこで、作成された Unicode 文字列を調べました。

ifile = open(fname, "r")
for row in csv.reader(ifile):
    name = row[0]
    unicode_name = unicode(name, 'utf-8')
    print repr(unicode_name)

そして出力は

 > u'\xc1lvaro Salazar'
 > u'\xc9lodie Yung'

これらは16進数の値が壊れているように見えるので、今は完全に混乱しています。私はこの質問を読みました:

私はすべてを正しく行っているように見え、ファイルが実際には UTF8 ではないと信じるようになりましたが、最初reprにセルの値を出力すると、UTF8 16 進値が修正されているように見えます。誰かが私の問題を指摘するか、私の理解がどこで壊れているかを示すことができますか (エンコーディングのジャングルで迷子になり始めているため)


余談ですがcodecs、ファイルを開いて Unicode オブジェクトに直接読み込むために使用できると思いますが、csvモジュールはネイティブで Unicode をサポートしていないため、このアプローチを使用できます。

4

1 に答える 1

5

デフォルトのエンコーディングは ASCII です。したがって、オブジェクトを印刷しよunicodeうとすると、インタープリターは ASCII コーデックを使用してエンコードを試みますが、テキストに ASCII に存在しない文字が含まれているため失敗します。

UTF-8 でエンコードされたバイト文字列を出力してもエラーが発生しない理由 (混乱するはずではありませんが) は、単にバイトが端末に送信されるためです。Python エラーが発生することはありませんが、端末がバイトの処理方法を認識していない場合は、醜い出力が生成される可能性があります。

Unicode を印刷するには、 を使用しますprint some_unicode.encode('utf-8')。(または、端末が実際に使用しているエンコードは何でも)。

に関してはu'\xc1lvaro Salazar'、ここでは何も壊れていません。文字Áは Unicode コードポイント C1 (UTF-8 表現とは関係ありませんが、たまたま Latin-1 と同じ値です) にあり、Python はコードポイントにUnicode コードポイント表記の\x代わりに 16 進エスケープを使用します。\uスペースを節約するための最上位バイトとして 00 (これを として表示することもできます\u00c1。)

Python で Unicode がどのように機能するかの概要を理解するには、http://nedbatchelder.com/text/unipain.htmlをお勧めします。

于 2013-08-28T11:18:50.903 に答える