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

貌似文件开始的#coding:gb2312只对u'string'管用,对unicode('string')不管用,谁清楚两者的区别

首先要弄清楚的是,在python里,string object和unicode object是两种不同的类型。

string object是由characters组成的sequence,而unicode object是Unicode code units组成的sequence。

string里的character是有多种编码方式的,比如单字节的ASCII,双字节的GB2312等等,再比如UTF-8。很明显要想解读string,必需知道string里的character是用哪种编码方式,然后才能进行。

Unicode code unit又是什么东西呢?一个Unicode code unit是一个16-bit或者32-bit的数值,每个数值代表一个unicode符号。在python里,16-bit的unicode,对应的是ucs2编码。32-bit对应的是ucs4编码。是不是感觉string里character的编码没什么区别?反正我现在脑子里就是这样一个印象:在Python里,ucs2或者ucs4编码的,我们叫做unicode object,其他编码的我们就叫做string。

至于python里的unicode到底是ucs2还是ucs4的,可以在编译时指定。例如Linux下,要用ucs2做unicode的编码,可以这样
# ./configure --enable-unicode=ucs2
# make
# make install
下载的Windows预编译版本,一般都是ucs2的。要想知道某个python运行环境是ucs2还是ucs4,可以查看sys.maxunicde,65535就是ucs2的,另一个很大的数值就是ucs4。

下面我们看看string和unicode在python里的不同
我们先看看在简体中文Windows 2003系统下,系统编码是GBK
>>> a = '你好'
>>> a
'/xc4/xe3/xba/xc3'
>>> b = u'你好'
>>> b
u'/u4f60/u597d'
>>> print a
你好
>>> print b
你好
>>> a.__class__

>>> b.__class__

>>> len(a)
4
>>> len(b)
2

在一个系统编码为UTF-8的Linux环境下
>>> a = '你好'
>>> a
'/xe4/xbd/xa0/xe5/xa5/xbd'
>>> b = u'你好'
>>> b
u'/u4f60/u597d'
>>> print a
你好
>>> print b
你好
>>> a.__class__

>>> b.__class__

>>> len(a)
6
>>> len(b)
2

如何?简单总结一下:
1、string直接用引号来表示,unicode在引号前加一个u
2、直接输入的string常量会用系统缺省编码方式来编码,例如在GBK环境下,'你好'会编码成'/xc4/xe3/xba/xc3',而在UTF-8环境下就成了'/xe4/xbd/xa0/xe5/xa5/xbd'。
3、len(string)返回string的字节数,len(unicode)返回的是字符数
4、很重要的一点,print unicode不会乱码。现在我们常用的Linux、Windows系统,都是支持unicode的,版本太老的不算。比如Windows 2003支持ucs2,所以在中文Windows2003下,除了可以正常显示缺省的GBK编码外,还可以正常显示ucs2编码。举个例子,还是在中文Windows 2003的GBK环境下:
>>>a = '/xe4/xbd/xa0/xe5/xa5/xbd' # UTF-8的'你好'
>>> print a
浣犲ソ
>>> b = unicode(a, "UTF-8")
>>> b
u'/u4f60/u597d'
>>> print b
你好

应该明白了吧?

下面再说说string和unicode的相互转换,什么unicode()、decode()、encode()、codecs之类的。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-05-16
可以告诉你没区别吗。
u'string' 表示 已经是 unicode 编码的 'string' 字符串
而 unicode('string') 是 即将要把 'string' 转化为 unicode 编码(但在执行这条语句之前,还不一定是unicode编码)

文件开始,是整体中的字符编码。一般使用 #coding:utf-8 最好还是使用utf-8追问

我一开始也是这样认为的,但实际操作发现并非如此,如果文件开始用utf-8,那么执行就会报错,必须用gb2312,而且文件开始只是写了#coding:gb2312的话,unnicode(‘string’)就会报错,那么显然两者是不同的,现在我的问题是,我不知道为什么不一样

追答

unicode 初始化 源码

    def __init__(self, string=u'', encoding=None, errors='strict'): # known special case of unicode.__init__
        """
        unicode(object='') -> unicode object
        unicode(string[, encoding[, errors]]) -> unicode object
        
        Create a new Unicode object from the given encoded string.
        encoding defaults to the current default string encoding.
        errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'.
        # (copied from class doc)
        """
        pass

追问

找到了一点线索,当输入如下内容:
import sys
reload(sys)
sys.setdefaultencoding('gb2312')
则unicode('string')就不报错了,但如果不输入,只有文件开头的#coding:gb2312就会报错,但如果文件中只有u'string',则不输入import sys这一堆也没事,还是不知道为什么,如果源码都找不到答案,难道和环境有关系?

追答

你添加
sys.setdefaultencoding('gb2312')

这个的意思,是更改cmd的也就是系统的默认编码的。windows默认是一般是gbk
你也可以

sys.setdefaultencoding('utf-8')

最主要的问题就是编码字符集不一致问题。

将所有的都设置成 utf-8 编码。什么问题都没了。

本回答被网友采纳
相似回答