[英]Python unicode string literals :: what's the difference between '\u0391' and u'\u0391'
[英]What is the difference between u' ' prefix and unicode() in python?
你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字符的文本文件,例如“上午”,如何阅读并正确打印出来?
u'..'
是一个字符串文字,并根据源编码声明解码字符。
unicode()
是一个将另一个类型转换为unicode
对象的函数,你给它一个字节字符串文字 。 它将根据默认的ASCII编解码器解码字节字符串。
因此,您使用不同类型的文字表示法创建了一个字节字符串对象,然后尝试将其转换为unicode()
对象,该对象失败,因为str
- > unicode
转换的默认编解码器是ASCII。
这两个是完全不同的野兽。 如果你想使用后者,你需要给它一个明确的编解码器:
print unicode('上午', 'utf8')
这两者的相关性与使用0xFF
和int('0xFF', 0)
相关的方式相同; 前者使用十六进制表示法定义值255的整数,后者使用int()
函数从字符串中提取整数。
另一种方法是使用str.decode()
方法 :
print '上午'.decode('utf8')
除非你知道自己在做什么,否则不要试图使用错误处理程序(例如ignore'
或'replace'
)。 'ignore'
尤其可以掩盖选择错误编解码器的潜在问题。
您可能想要阅读Python和Unicode:
Ned Batchelder的实用Unicode
绝对最低每个软件开发人员绝对必须知道关于Unicode和字符集(没有任何借口!)作者:Joel Spolsky
当str
在Python 2.7.x
没有以u''
为前缀时,解释器看到的是一个字节字符串,没有显式编码。
如果您没有告诉解释器在执行unicode()
时如何处理这些字节,它将(如您所见)默认尝试通过ascii编码方案decode
它看到的字节。
它是尝试将str
的普通字节转换为unicode
对象的初步步骤。
使用ascii
进行decode
意味着:尝试使用硬编码映射( 0
到127
之间的数字)来解释str
每个字节。
您遇到的错误就像一个dict
KeyError
:解释器遇到一个ascii
编码方案没有指定映射的字节。
由于解释器不知道如何处理字节,因此会抛出错误。
您可以通过告诉解释器使用另一组编码/解码映射来decode
字节来改变该初步步骤,而不是ascii,例如UTF-8
,如其他答案中详细说明的那样。
如果解释器在str
中的每个字节(或字节)中找到所选方案中的映射,则它将成功解码,并且解释器将使用生成的映射来生成unicode
对象。
Python unicode
对象是一系列Unicode 代码点 。 Unicode 代码空间中有1,112,064个有效代码点。
如果您选择用于解码的方案是您的文本(或代码点)编码的方案,则打印时的输出应与原始文本相同。
也可以考虑尝试Python 3
。 相关的差异在下面的第一条评论中解释。
Unicode是一种对象类型,而“u”是用于表示该对象是unicode对象的文字。 它类似于用于表示long int的'L'文字。
请尝试:'上午'.decode('utf8','ignore')。encode('utf8')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.