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

What is the difference between u' ' prefix and unicode() in python?

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

1
2
3
4
# -*- 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字符的文本文件,例如"下午",如何正确读取和打印它?


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

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

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

这两种动物完全不同。如果要使用后者,则需要为其提供显式编解码器:

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

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

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

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

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

您可能需要阅读关于python和unicode的内容:

  • Ned Batchelder的实用Unicode

  • 绝对最小值每个软件开发人员绝对,肯定必须知道Unicode和字符集(没有借口!)Joel Spolsky

  • python unicode howto


strPython 2.7.x中没有前缀u''时,解释器看到的是一个没有显式编码的字节字符串。

如果在执行unicode()时不告诉解释器如何处理这些字节,则(如您所见)默认为尝试decode通过ASCII编码方案所看到的字节。

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

使用asciidecode意味着:尝试用硬编码映射解释str的每个字节,该映射是0127之间的一个数字。

您遇到的错误类似于dictKeyError:解释器遇到了一个字节,该字节的ascii编码方案没有指定的映射。

因为解释器不知道如何处理字节,所以它抛出了一个错误。

您可以通过使用另一组编码/解码映射(一组超出ASCII的映射,如UTF-8)将字节告知decode,来更改这一初步步骤,如其他答案中所述。

如果解释器在所选方案中为str中的每个字节(或字节)找到一个映射,它将成功解码,解释器将使用生成的映射生成unicode对象。

python unicode对象是一系列Unicode代码点。Unicode代码空间中有1112064个有效代码点。

如果您选择的解码方案是对文本(或代码点)进行编码的方案,那么打印时的输出应该与原始文本相同。

也可以考虑尝试Python 3。相关差异在下面的第一个注释中解释。


请尝试:"下午"。解码("utf8","忽略")。编码("utf8")


unicode是一个对象类型,而"u"是用于表示该对象是unicode对象的文字。它类似于用来表示long int的"l"字面值。