web-dev-qa-db-ja.com

Python3:UnicodeEncodeError: 'ascii'コーデックは文字 '\ xfc'をエンコードできません

OSXでpython 3.5.1を使用して非常に簡単な例を実行しようとしていますが、私は本当に行き詰まっています。同様の問題を扱っている多くの記事を読んでいますが、これを修正できませんこの問題を解決するためのヒントはありますか?

エラーなくmylistで定義された正しいエンコードされたlatin-1出力を取得したいと思います。

私のコード:

# coding=<latin-1>

mylist = [u'Glück', u'Spaß', u'Ähre',]
print(mylist)

エラー:

Traceback (most recent call last):
File "/Users/abc/test.py", line 4, in <module>
print(mylist)
UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 4: ordinal not in range(128)

エラーを修正することができますが、それでもstdout(print)で何か問題が発生する方法:

mylist = [u'Glück', u'Spaß', u'Ähre',]
    for w in mylist:
        print(w.encode("latin-1"))

出力として得られるもの:

b'Gl\xfcck'
b'Spa\xdf'
b'\xc4hre'

「ロケール」が示すもの:

LANG="de_AT.UTF-8"
LC_COLLATE="de_AT.UTF-8"
LC_CTYPE="de_AT.UTF-8"
LC_MESSAGES="de_AT.UTF-8"
LC_MONETARY="de_AT.UTF-8"
LC_NUMERIC="de_AT.UTF-8"
LC_TIME="de_AT.UTF-8"
LC_ALL=

-> 'python3'が私に示すもの:

Python 3.5.1 (default, Jan 22 2016, 08:54:32) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
11
Hans Bondoka

文字を削除します<および>

# coding=latin-1

これらの文字は、エンコード名の位置を示すために例でよく使用されますが、リテラル文字<および>はファイルに含めないでください。

そのためには、fileをlatin-1を使用してエンコードする必要があります。ファイルが実際にutf-8を使用してエンコードされている場合、エンコード行は

# coding=utf-8

たとえば、このスクリプトを実行すると(latin-1エンコーディングのファイルとして保存されます):

# coding=latin-1

mylist = [u'Glück', u'Spaß', u'Ähre',]
print(mylist)

for w in mylist:
    print(w.encode("latin-1"))

次の出力を取得します(エラーなし):

['Glück', 'Spaß', 'Ähre']
b'Gl\xfcck'
b'Spa\xdf'
b'\xc4hre'

その出力は正しいようです。たとえば、üのlatin-1エンコーディングは'\xfc'

エディターを使用して、ファイルをlatin-1エンコードで保存しました。 16進数のファイルの内容は次のとおりです。

$ hexdump -C  codec-question.py 
00000000  23 20 63 6f 64 69 6e 67  3d 6c 61 74 69 6e 2d 31  |# coding=latin-1|
00000010  0a 0a 6d 79 6c 69 73 74  20 3d 20 5b 75 27 47 6c  |..mylist = [u'Gl|
00000020  fc 63 6b 27 2c 20 75 27  53 70 61 df 27 2c 20 75  |.ck', u'Spa.', u|
00000030  27 c4 68 72 65 27 2c 5d  0a 70 72 69 6e 74 28 6d  |'.hre',].print(m|
00000040  79 6c 69 73 74 29 0a 0a  66 6f 72 20 77 20 69 6e  |ylist)..for w in|
00000050  20 6d 79 6c 69 73 74 3a  0a 20 20 20 20 70 72 69  | mylist:.    pri|
00000060  6e 74 28 77 2e 65 6e 63  6f 64 65 28 22 6c 61 74  |nt(w.encode("lat|
00000070  69 6e 2d 31 22 29 29 0a                           |in-1")).|
00000078

3行目の最初のバイト(16進数で表される)(つまり、位置0x20の文字)はfcであることに注意してください。それがüのlatin-1エンコーディングです。 fileがutf-8を使用してエンコードされた場合、文字üは2バイトc3 bc

6

明示的に定義されたPYTHONIOENCODING環境変数でスクリプトを実行してみてください:

PYTHONIOENCODING=utf-8 python3 script.py
6
markhor