Python3: UnicodeEncodeError: 'ascii' codec can't encode character '\xfc'
Python3: UnicodeEncodeError: 'ascii' codec can't encode character '\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(打印)仍然出错:
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'
'locale' 向我显示的内容:
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'
删除字符<
和>
:
# 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
.
使用明确定义的 PYTHONIOENCODING
环境变量尝试 运行 脚本:
PYTHONIOENCODING=utf-8 python3 script.py
如果您在 reading/writing 一个文件时遇到这个问题,请试试这个
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)
我试图在 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(打印)仍然出错:
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'
'locale' 向我显示的内容:
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'
删除字符<
和>
:
# 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
.
使用明确定义的 PYTHONIOENCODING
环境变量尝试 运行 脚本:
PYTHONIOENCODING=utf-8 python3 script.py
如果您在 reading/writing 一个文件时遇到这个问题,请试试这个
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)