Python里的string 和 unicode (一)

转载 2015年07月08日 15:37:30
首先要弄清楚的是,在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里的string 和 unicode (一)

首先要弄清楚的是,在python里,string object和unicode object是两种不同的类型。 string object是由characters组成的sequence,而uni...

Python 2.x 中的 String 与 Unicode

在 Python 2.x 中是有两种字串符相关类型的,分别为 String 和 Unicode,两者提供的接口非常类似,有时候又能自动转换,蛮容易误导人的。在 Python 3 中 这两个类型分别用 ...

python string,Unicode和Qstring学习笔记

python string和PyQt的QString的区别  以下在Python2.6和PyQt4.4.4 for Python2,6环境下讨论: Python中有两种有关字符的类型:Pyth...

Python 中string和unicode的区别

前段时间在写一个excel文件内容比较的脚本时遇到关于string对象和unicode对象的比较问题。开始写的时候没有先获取对象的type查看,就直接按照string的比较方法进行操作,结果总是得不到...

C++: std::string 与 Unicode 如何结合?

C++: std::string 与 Unicode 如何结合?  一旦知道 TCHAR 和_T 是如何工作的,那么这个问题很简单。基本思想是 TCHAR 要么是char,要么是 wchar_t,这...

java String,Jni jstring, utf-8/unicode interoperate sample code

继 前一篇 jni基本原理后,这里写了一个sample code,有关java String object 如何传到 jni jstring,native code 如何取得 java String ...

STL string与CString的Unicode字符集

1、delete[] TCHAR的问题:a TCHAR array that has been allocated with new. However, when I try to delete it...

MFC新手心得体会(外部类访问dlg变量,unicode中cstring转string)

这几个月在研究如何使用mfc, 然而遇到了许多问题,需要经常上网寻找适用的解决办法。 今天尝试制作了一个学生信息管理系统,纠结了一整天终于取得了点进展,下面总结一下我在调试过程中确认能用的几个方法。 ...
  • pkohd
  • pkohd
  • 2015-12-28 00:17
  • 289

Unicode编码的项目中CString、char* 、wstring、string的相互转换

1、CString转char* 可以使用以下函数: static char* StringToChar(CString str){ //获取字符串大小 int len = WideCharTo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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