|
|
51CTO旗下网站
|
|
移动端

2.2.3 Unicode字符串

《自学Python:编程基础、科学计算及数据分析》第2章Python 基础,在本章中,我们将学习Python 语言的基本使用,掌握Python 的基本使用方法,为后续的学习打下基础。本节为大家介绍Unicode字符串。

作者:李金来源:机械工业出版社|2018-05-03 16:21

2.2.3 Unicode字符串

Python的字符串类型在表示其他语言的文字时可能会遇到一些问题,以中文为例:

  1. In [1]: a = "中国" 

a的长度:

  1. In [2]: len(a)   
  2. Out[2]: 6 

两个中文字符构成的字符串长度是 6,这不符合我们的认知。直接查看 a的值会发现, a其实存储了六个ASCII编码:

  1. In [3]: a   
  2. Out[3]: '\xe4\xb8\xad\xe5\x9b\xbd' 

其中,“\xe4”是一个 ASCII编码。在数字中,“0x”表示十六进制,在字符串中,“\x”是16进制转义字符的开头。因此,“\xe4”表示的是ASCII码中的228:

  1. In [4]: 0xe4   
  2. Out[4]: 228 

国际标准的 ASCII码是 0~127,后面的 128~255经过组合可以生产一些比较不规则的文字的编码,如汉字等。

使用print打印a:

  1. In [5]: print a  
  2. 中国 

为了更好地表示其他语言的文字,人们创建了另一种新的编码方式:Unicode。 Unicode,又称万国码、国际码、统一码、单一码等,它将世界上大部分的文字系统进行了整理、编码,并进行一对一的编码,使得计算机可以用更为简单的方式来呈现和处理文字。

Python提供了 Unicode字符串来使用 Unicode编码,定义时,只需要在字符串前面加上字母u:

  1. In [6]: b = u"中国" 

b的类型不是字符串str,而是unicode:

  1. In [7]: type(b)   
  2. Out[7]: unicode 

b的长度:

  1. In [8]: len(b)   
  2. Out[8]: 2 

b的表示:

  1. In [9]: b   
  2. Out[9]: u'\u4e2d\u56fd' 

其中,“\u”是Unicode字符的转义表示,它对应于数字上的十六进制表示。对于普通的英文字符,可以直接使用 str()函数和 unicode()函数实现字符串和 Unicode字符串的相互转换。但是,对于非英文字符串a,直接使用unicode()函数是不可以的:

  1. In [10]: unicode(a)  
  2. -----------------------------------------------------------------------  
  3. UnicodeDecodeError Traceback (most recent call last)  
  4. <ipython-input-10-890be670e9df> in <module>()  
  5. ----> 1 unicode(a)  
  6. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0:  
  7. ordinal not in range(128) 

对于非英文 Unicode字符串 b,直接使用str()函数也是不可以的:

  1. In [11]: str(b)  
  2. -----------------------------------------------------------------------  
  3. UnicodeEncodeError Traceback (most recent call last)  
  4. <ipython-input-11-a97e8db495c5> in <module>()  
  5. ----> 1 str(b)  
  6. UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-  
  7. 1: ordinal not in range(128) 

对于这种情况,Python提供了.decode()方法将字符串解码为 Unicode字符串,以及.encode()方法将Unicode字符串编码为字符串。

对于字符串a,可以使用.decode()方法将其解码为Unicode字符串:

  1. In [12]: a.decode("utf-8")  
  2. Out[12]: u'\u4e2d\u56fd' 

对于Unicode字符串b,可以使用.encode()方法将其编码为字符串:

  1. In [13]: b.encode("utf-8")  
  2. Out[13]: '\xe4\xb8\xad\xe5\x9b\xbd' 

事实上,unicode()函数不能直接使用的原因是我们没有指定字符的编码方式:

  1. In [14]: unicode(a, "utf-8")  
  2. Out[14]: u'\u4e2d\u56fd' 

str()函数则没有这样的用法。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

C# 2005 & .NET 3.0高级编程(第5版)

该书为C#经典名著!是Wrox红皮书中最畅销的品种之一。从第1版开始就名满天下;其第3版被评选为2005年最权威的十大IT图书之一;并荣获“2005...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊