Python里的string 和 unicode (一)

转载 2013年09月12日 16:25:55
首先要弄清楚的是,在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__
<type 'str'>
>>> b.__class__
<type 'unicode'>
>>> 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__
<type 'str'>
>>> b.__class__
<type 'unicode'>
>>> 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之类的。

【分享】Python – 了解bytes、str与unicode的区别

原创文章,转载请注明: 转载自勤奋的小青蛙链接地址: 【分享】Python – 了解bytes、str与unicode的区别Python的字符串编码很容易把人搞混,分享一篇文章,用来解释python ...
  • Lucky_BOY1987
  • Lucky_BOY1987
  • 2018年01月19日 11:02
  • 25

python中string和Unicode的区别

首先要弄清楚的是,在python里,string object和unicode object是两种不同的类型。 string object是由characters组成的sequence,而uni...
  • permike
  • permike
  • 2016年06月23日 10:52
  • 3435

Python里的string 和 unicode (二)

继续。 先说一下,前面提到,print(string)的时候,如果string是按当前环境编码方式编码的,可以正常输出,不会乱码;如果string不是当前编码的,就会乱码。而print(unic...
  • wangyuan0916
  • wangyuan0916
  • 2013年09月12日 16:26
  • 457

Python里的string 和 unicode --2

先说一下,前面提到,print(string)的时候,如果string是按当前环境编码方式编码的,可以正常输出,不会乱码;如果string不是当前编码的,就会乱码。而print(unicode)是不会...
  • wangfaqiang
  • wangfaqiang
  • 2014年05月09日 15:19
  • 517

Python里的string 和 unicode

在python里,string object和unicode object是两种不同的类型。 string object是由characters组成的sequence,而unicode obje...
  • wangfaqiang
  • wangfaqiang
  • 2014年05月09日 15:19
  • 487

Python里的string 和 unicode (三)

最后说说关于codecs。所谓的codec就是编码器和解码器(encoder and decoder)的集合。除了各种字符串编码的codec,还有各种文件格式的codec,比如压缩、解压缩的,图像的,...
  • FeiSan
  • FeiSan
  • 2007年07月17日 11:42
  • 1314

Python: 在Unicode和普通字符串之间转换

1.1. 问题Problem You need to deal with data that doesn't fit inthe ASCII character set. 你需要处理不适合...
  • u012448083
  • u012448083
  • 2016年07月15日 16:06
  • 20693

python字符串和变量相加时出现,coercing to unicode need string or buffer nonetype found python 错误的解决

这是由于类型不对,而导致的         1  我是用 “a”+b这个时候产生的错误,         2  这是由于 ,在 python中 +号是针对两个类型相同的变量,而在上的语句中,pyt...
  • changdejie
  • changdejie
  • 2014年01月23日 14:17
  • 6531

python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

摘要:在进行python脚本的编写时,如果我们用python来处理网页数据或者进行与中文字符有关的处理工作,经常出现这样的出错信息:SyntaxError: Non-ASCII character '...
  • trochiluses
  • trochiluses
  • 2013年11月21日 16:28
  • 104606

Python里的string 和 unicode (一)收藏

首先要弄清楚的是,在python里,string object和unicode object是两种不同的类型。string object是由characters组成的sequence,而unicode...
  • ktb2007
  • ktb2007
  • 2009年02月11日 10:56
  • 34733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python里的string 和 unicode (一)
举报原因:
原因补充:

(最多只允许输入30个字)