UnicodeEncodeError:'ascii' 编解码器无法在位置 3 处编码字符 u'\u2013',序号不在范围(128)内
我正在用xlrd解析一个XSL文件,大部分功能都正常。我有一个字典,里面的键是字符串,值是字符串的列表。所有的键和值都是Unicode格式的。我可以用str()
方法打印出大部分的键和值。但有些值里面有Unicode字符\u2013
,这让我遇到了错误。
我怀疑这个问题是因为这是嵌套的Unicode,而Python解释器无法解码它。那么我该怎么解决这个错误呢?
8 个回答
这里提到的 str(u'\u2013')
会导致错误,所以可以使用 isinstance(foo,basestring)
来检查一个变量是否是 Unicode 字符串。如果它不是基本字符串类型,就把它转换成 Unicode,然后再进行编码。
if isinstance(foo,basestring):
foo.encode('utf8')
else:
unicode(foo).encode('utf8')
你也可以试试这个方法来获取文本。
foo.encode('ascii', 'ignore')
你也可以直接打印Unicode对象,不需要用str()包裹它。
假设你确实想要一个字符串:
当你使用str(u'\u2013')时,你是在尝试把Unicode字符串转换成8位字符串。为了做到这一点,你需要使用一种编码,这是一种把Unicode数据映射到8位数据的方式。str()的作用是使用系统默认的编码,在Python 2中,这个默认编码是ASCII。ASCII只包含Unicode的前127个字符,也就是从\u0000到\u007F。因此,你会得到上面的错误,因为ASCII编码根本不知道\u2013是什么(顺便说一下,它是一个长横线)。
所以你需要指定你想使用的编码。常见的编码有ISO-8859-1,通常叫做Latin-1,它包含前256个字符;UTF-8,它可以通过可变长度编码来表示所有字符;还有CP1252,这在Windows上很常见,以及各种中文和日文编码。
你可以这样使用它们:
u'\u2013'.encode('utf8')
结果是一个包含字节序列的字符串,这个字节序列是你所关心的字符的UTF-8表示:
'\xe2\x80\x93'
然后你可以打印它:
>>> print '\xe2\x80\x93'
–