Python 2.7字符编码问题 - \u2013

7

I have following code:

# -*- coding: utf-8 -*-

print u"William Burges (1827–81) was an English architect and designer."

当我尝试从命令行运行它时,会出现以下消息:

Traceback (most recent call last):
  File "C:\Python27\utf8.py", line 3, in <module>
    print u"William Burges (1827ŌĆō81) was an English architect and designer."
  File "C:\Python27\lib\encodings\cp775.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2013' in position
 20: character maps to <undefined>

我该如何解决这个问题,并让Python读取这个\ u2013字符?为什么Python在现有代码中不能读取它,我以为utf-8适用于每个字符。

谢谢

编辑:

此代码打印所需的结果:

# -*- coding: utf-8 -*-

print unicode("William Burges (1827-81) was an English architect and designer.", "utf-8").encode("cp866")

但是当我尝试打印超过一个句子时,例如:
# -*- coding: utf-8 -*-

print unicode("William Burges (1827–81) was an English architect and designer. I am here. ", "utf-8").encode("cp866")

我收到了相同的错误信息:
Traceback (most recent call last):
  File "C:\Python27\utf8vs.py", line 3, in <module>
    print unicode("William Burges (1827ŌĆō81) was an English architect and desig
ner. I am here. ", "utf-8").encode("cp866")
  File "C:\Python27\lib\encodings\cp866.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2013' in position
 20: character maps to <undefined>

5
打印输出是一件不同的事情;Python需要将值编码以适用于您的控制台。 - Martijn Pieters
@MichaelKazarian:这就是print已经做的事情,这也是为什么OP会看到编码异常的原因。 - Martijn Pieters
2
强制链接:http://www.joelonsoftware.com/articles/Unicode.html, http://kunststube.net/encoding/ - georg
3个回答

3

您的字符串中包含了“ndash”符号,它类似于ASCII减号-,请参见第45个符号ASCII表。将“ndash”替换为“减号”,因为ASCII无法包含“ndash”。下面是可行的变体:

# -*- coding: utf-8 -*-

my_string = "William Burges (1827–81) was an English architect and designer."
my_string = my_string.replace("–", "-")# replace utf-8 symbol (ndash) to ascii (-)
print my_string

输出

William Burges (1827-81) was an English architect and designer. I am here. 

2
我怀疑问题是由于打印语句而不是Python本身造成的(在我的Mac上可以正常工作)。为了打印字符串,需要将其转换为可显示的格式。您使用的较长破折号在Windows命令行的默认字符集中无法显示。
你两个句子之间的区别不在于长度,而是在于"(1827-81)"和"(1827–81)"中使用的破折号类型——你能看出微妙的区别吗?尝试复制粘贴一个到另一个来检查。
另请参见Python、Unicode和Windows控制台

1

实际上,wiki.python.org 上有一篇关于这个问题的维基文章https://wiki.python.org/moin/PrintFails,解释了为什么使用 charmap 编解码可能会出现这种情况。

如上所述,设置 PYTHONIOENCODING 环境变量可用于抑制错误消息。不建议将其设置为 "utf-8",因为这会产生不准确、乱码的控制台输出。为获得最佳结果,请使用您的控制台的正确默认代码页和适当的错误处理程序,而不是 "strict"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接