【问题标题】:Python3: UnicodeEncodeError: 'ascii' codec can't encode character '\xfc'Python3:UnicodeEncodeError:“ascii”编解码器无法编码字符“\xfc”
【发布时间】:2016-12-17 09:18:05
【问题描述】:

我正在尝试使用 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'

“语言环境”向我展示了什么:

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'

【问题讨论】:

  • 在我的 python 3.4 windows 版本上运行良好:mylist = [u'Glück', u'Spaß', u'Ähre',] for w in mylist: print(w) output: Glück Spaß Ähre所以这里没问题。请注意,如果您使用 encode,您会得到 bytes 类型,而不是您想要的类型。

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


【解决方案1】:

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

PYTHONIOENCODING=utf-8 python3 script.py

【讨论】:

  • 很酷的例子,它的工作原理和与此问题的其他解决方案不同的事实使得这很值得。
【解决方案2】:

删除字符&lt;&gt;

# coding=latin-1

这些字符通常在示例中用于指示编码名称的位置,但文字字符 &lt;&gt; 不应包含在您的文件中。

为此,您的 文件 必须使用 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

【讨论】:

  • 感谢您的详细解释!
【解决方案3】:

如果你在读/写文件时遇到这个问题,那么试试这个

import codecs

# File read 
with codecs.open(filename, 'r', encoding='utf8') as f:
    text = f.read()

# File write
with codecs.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 2010-12-11
    • 2012-07-02
    • 2010-12-11
    • 2021-09-28
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多