我正在使用xlrd解析xsl文件。大多数事情都很好。我有一个字典,其中键是字符串,值是字符串列表。所有键和值都是unicode。我可以使用str()
方法打印大部分键和值。但是有些值具有unicode字符 - \u2013
,我得到了上述错误。
我怀疑这种情况正在发生,因为这是嵌入在unicode中的unicode,而python解释器无法对其进行解码。那我怎么能摆脱这个错误呢?
提前致谢。
答案 0 :(得分:71)
你也可以打印Unicode对象,你不需要在它周围做str()。
假设你真的想要一个str:
当你执行str(u'\ u2013')时,你试图将Unicode字符串转换为8位字符串。为此,您需要使用编码,即Unicode数据与8位数据之间的映射。 str()的作用是使用系统默认编码,在Python 2下是ASCII。 ASCII仅包含Unicode的127个第一个代码点,即\ u0000到\ u007F1。结果是你得到了上面的错误,ASCII编解码器只是不知道\ u2013是什么(这是一个很长的破折号,顺便说一句)。
因此,您需要指定要使用的编码。常见的是ISO-8859-1,最常见的是Latin-1,它包含256个第一代码点; UTF-8,可以使用可变长度编码编码所有代码点,Windows上常见的CP1252,以及各种中文和日文编码。
你像这样使用它们:
u'\u2013'.encode('utf8')
结果是一个包含字节序列的str,它是所讨论字符的uTF8表示:
'\xe2\x80\x93'
你可以打印出来:
>>> print '\xe2\x80\x93'
–
答案 1 :(得分:25)
您也可以尝试这样来获取文字。
foo.encode('ascii', 'ignore')
答案 2 :(得分:7)
因为这里str(u'\u2013')
导致错误,所以使用isinstance(foo,basestring)
检查unicode / string,如果不是类型base string将其转换为Unicode然后应用encode
if isinstance(foo,basestring):
foo.encode('utf8')
else:
unicode(foo).encode('utf8')
答案 3 :(得分:5)
我遇到了同样的问题。这对我来说很好:
str(objdata).encode('utf-8')
答案 4 :(得分:0)
对我来说这是有效的
的unicode(数据).encode(' UTF-8&#39)
答案 5 :(得分:0)
在最近的一个项目中,我确实遇到了这个问题,这确实给人带来痛苦。我终于发现这是因为我们在Docker中使用的Python编码为“ ansi_x3.4-1968”,而不是“ utf-8”。因此,如果有人在使用Docker并出现此错误,请按照以下步骤彻底解决您的问题。
在Dockerfile的同一目录中创建一个文件并将其命名为 default_locale ,
environment = LANG =“ es_ES.utf8”,LC_ALL =“ es_ES.UTF-8”,LC_LANG =“ es_ES.UTF-8”
将这些添加到您的Dockerfile中,
运行apt-get clean && apt-get update && apt-get install -y语言环境
运行区域设置en_CA.UTF-8
复制。/default_locale/ etc / default / locale
运行chmod 0755 / etc / default / locale
ENV LC_ALL = en_CA.UTF-8
ENV LANG = en_CA.UTF-8
ENV LANGUAGE = en_CA.UTF-8
当我再次构建并运行Docker时,这彻底解决了我的问题,希望也能解决您的问题。
答案 6 :(得分:0)
首先在这个链接中找出什么字符是unicode https://unicode-table.com/en/2013/
然后在代码中使用:
{your-string-variable}.replace(u"\u2013", "-")
对于所有有错误的 unicode 也是如此。