Python3:UnicodeEncodeError:' ascii'编解码器不能对字符' \ xfc'进行编码。

时间:2016-08-10 20:15:14

标签: python-3.x iso-8859-1 python-unicode

我正在尝试使用python 3.5.1在OSX上运行一个非常简单的示例,但我真的被困了。已经阅读了很多处理类似问题的文章,但我自己无法解决这个问题。您是否有任何提示如何解决此问题?

我想在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(打印)错误:

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'

什么&#39; locale&#39;告诉我:

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=

什么 - &GT; &#39; python3&#39;告诉我:

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'

4 个答案:

答案 0 :(得分:5)

删除字符<>

# coding=latin-1

这些字符经常在示例中用于指示编码名称的位置,但文字字符<>不应包含在您的文件中。

要使其正常工作,必须使用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编码保存文件。十六进制文件的内容是:

$ 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

注意第三行中的第一个字节(以十六进制表示)(即位置0x20处的字符)是fc。这是ü的latin-1编码。如果使用utf-8编码文件,则字符ü将使用两个字节c3 bc表示。

答案 1 :(得分:2)

尝试使用明确定义的PYTHONIOENCODING环境变量运行脚本:

PYTHONIOENCODING=utf-8 python3 script.py

答案 2 :(得分:0)

如果在读取/写入文件时遇到此问题,请尝试

import json

names=[]
with open('data.txt') as json_file:
  dict=json.load(json_file)["streamers"]
  for tuple in dict:
    if "name" in tuple:
      names.append(tuple["name"]
print(names)
 

答案 3 :(得分:-1)

您的环境变量设置错误。为我工作:

echo "LC_ALL=en_US.UTF-8" >> /etc/environment
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
locale-gen en_US.UTF-8