python中u''前缀和unicode()有什么区别?

时间:2015-08-20 07:17:52

标签: python unicode utf-8

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字符的文本文件,例如“上午”,如何阅读并正确打印出来?

4 个答案:

答案 0 :(得分:14)

  • u'..'是一个字符串文字,并根据源编码声明对字符进行解码。

  • unicode()是一个将另一种类型转换为unicode对象的函数,您已经为它指定了字节字符串文字。它将根据默认的ASCII编解码器解码字节字符串。

因此,您使用不同类型的文字表示法创建了一个字节字符串对象,然后尝试将其转换为unicode()对象,该对象失败,因为str的默认编解码器 - > unicode次转化是ASCII。

这两个是完全不同的野兽。如果你想使用后者,你需要给它一个明确的编解码器:

print unicode('上午', 'utf8')

这两者的相关性与使用0xFFint('0xFF', 0)相关的方式相同;前者使用十六进制表示法定义值255的整数,后者使用int()函数从字符串中提取整数。

另一种方法是使用str.decode() method

print '上午'.decode('utf8')

除非您知道自己在做什么,否则不要试图使用错误处理程序(例如ignore''replace')。例如,'ignore'尤其可以掩盖选择错误编解码器的潜在问题。

您可能想要阅读Python和Unicode:

答案 1 :(得分:2)

stru''中没有Python 2.7.x作为前缀时,解释器看到的是一个字节字符串,没有明确的编码。

如果你没有告诉解释器在执行unicode()时如何处理这些字节,它会(如你所见)默认尝试decode通过ascii看到的字节编码方案。

这是尝试将str的普通字节转换为unicode对象的初步步骤。

使用asciidecode表示:尝试使用硬编码映射解释str的每个字节,这是0127之间的数字。

您遇到的错误类似于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')