繁体   English   中英

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

[英]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')

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

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

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

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

您可能想要阅读Python和Unicode:

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

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

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

使用ascii进行decode意味着:尝试使用硬编码映射( 0127之间的数字)来解释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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM