u''
前缀和unicode()
之间有什么区别?
# -*- coding: utf-8 -*-
print u'上午' # this works
print unicode('上午', errors='ignore') # this works but print out nothing
print unicode('上午') # error
对于第三个print
,错误显示:UnicodeDecodeError:'ascii'编解码器无法解码位置0中的字节0xe4
如果我有一个包含非ascii字符的文本文件,例如“上午”,如何阅读并正确打印出来?
答案 0 :(得分:14)
u'..'
是一个字符串文字,并根据源编码声明对字符进行解码。
unicode()
是一个将另一种类型转换为unicode
对象的函数,您已经为它指定了字节字符串文字。它将根据默认的ASCII编解码器解码字节字符串。
因此,您使用不同类型的文字表示法创建了一个字节字符串对象,然后尝试将其转换为unicode()
对象,该对象失败,因为str
的默认编解码器 - > unicode
次转化是ASCII。
这两个是完全不同的野兽。如果你想使用后者,你需要给它一个明确的编解码器:
print unicode('上午', 'utf8')
这两者的相关性与使用0xFF
和int('0xFF', 0)
相关的方式相同;前者使用十六进制表示法定义值255的整数,后者使用int()
函数从字符串中提取整数。
另一种方法是使用str.decode()
method:
print '上午'.decode('utf8')
除非您知道自己在做什么,否则不要试图使用错误处理程序(例如ignore'
或'replace'
)。例如,'ignore'
尤其可以掩盖选择错误编解码器的潜在问题。
您可能想要阅读Python和Unicode:
答案 1 :(得分:2)
str
在u''
中没有Python 2.7.x
作为前缀时,解释器看到的是一个字节字符串,没有明确的编码。
如果你没有告诉解释器在执行unicode()
时如何处理这些字节,它会(如你所见)默认尝试decode
通过ascii看到的字节编码方案。
这是尝试将str
的普通字节转换为unicode
对象的初步步骤。
使用ascii
到decode
表示:尝试使用硬编码映射解释str
的每个字节,这是0
和127
之间的数字。
您遇到的错误类似于dict
KeyError
:解释器遇到ascii
编码方案没有指定映射的字节。
由于解释器不知道如何处理字节,因此会抛出错误。
您可以通过使用另一组编码/解码映射来告诉解释器decode
字节来改变该初步步骤,一个超出ascii,例如UTF-8
,如其他答案中详细说明的那样。
如果解释器在str
中为每个字节(或多个字节)找到所选方案中的映射,它将成功解码,解释器将使用生成的映射生成unicode
个对象。
Python unicode
对象是一系列Unicode code points。 Unicode code space中有1,112,064个有效代码点。
如果您选择用于解码的方案是您的文本(或代码点)编码的方案,则打印时的输出应与原始文本相同。
还可以考虑尝试Python 3
。相关的差异在下面的第一条评论中解释。
答案 2 :(得分:0)
Unicode是一种对象类型,而“' u'是一个用于表示该对象是unicode对象的文字。它类似于' L'用于表示long int的文字。
答案 3 :(得分:0)
请尝试:'上午'.decode('utf8','ignore')。encode('utf8')