python的字符串

1、在python3.0中,python的字符串是以unicode编码的,所以python是支持多语言的。
>>> print('中文')
中文
2、对于单个字符,可以使用ord()来获取它的整数表示,chr()可以把整数变成字符串。注意只能单个字符,多个就会报错。
>>> ord('中')
20013
>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(20013)
'中'

这些都是错的

>>> ord('中文')
TypeError: ord() expected a character, but string of length 2 found
>>> chr('97')
TypeError: an integer is required (got type str)
3、如果你知道某个字符串的其他进制数字,也可以用其他进制数字写str
>>> hex(20013)    #把中的十进制变成16进制
'0x4e2d'
>>> hex(25991)    #把文的十进制变成16进制
'0x6587'
>>> '\u4e2d\u6587'  
'中文'

4、在python中定义一个bytes类型,注意b'abc'和’abc'的差别,b'abc'的每个字符占一个字节,因为python文件中的字符串是unicode编码的,所以每个字符占用两个字节。尽管它是英文(ascii编码一个字母一个字节)。但是它本来是英文,只有一个字符,但是却要占用多一个字符,有点浪费,所以当python文件在传输或者保存的时候,把unicode转换为utf8.
>>> b'abc'
b'abc'
>>> b'中文'   #不能定义非ascii码的bytes,必须使用如下来转码
SyntaxError: bytes can only contain ASCII literal characters.
>>> bytes('中文','utf8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> bytes('中文','gbk')
b'\xd6\xd0\xce\xc4'

5、字符串在网络传输中、保存到磁盘上都以字节的形式运作的,所以我需要把str变成bytes。
>>> 'abc'.encode('ascii')    #把unicode的str通过encode可以编码为指定的bytes
b'abc'
>>> 'abc'.encode('utf8')
b'abc'
>>> 'abc'.encode('gbk')
b'abc'

>>> '中文'.encode('utf8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('gbk')
b'\xd6\xd0\xce\xc4'
>>> '中文'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 
#注意含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

>>> 'abc中文'.encode('utf8')
b'abc\xe4\xb8\xad\xe6\x96\x87'

6、当我们从网络或磁盘读取了字节流,我们需要把bytes转换为str
>>> b'abc'.decode()
'abc'
>>> b'abc'.decode('ascii')
'abc'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode()
'中文'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf8')
'中文'

它好像有默认,可以不用指定编码。

7、如果bytes中出现无法解码的字节会报错(就是写少的字节),我们需要传入errors='ignore'忽略错误的字节
>>> b'\xe4\xb8\xad\xe6'.decode('utf8', errors='ignore')
'中'
8、扩展

1、ascii是每个字符占一个字节,一个字节8位,可多可以代表255个整数,最开始的ascii只有127个分别代表大小写字母,0-9和一些符号。

2、ascii不满足其他国家的需求,所以就出现了许多其他编码,例如中国的gbk,日本的Shift_JIS等。

3、但是在多国语言的文本中,就会出现乱码,所以就得使用unicode,unicode最少是两个字节,就算你是英文a它也是2个字节表示(前面补0就行)。

4、但是如果你的文本里全是英文,用unicode编码这样就太浪费了,所以就得用utf8(可变长编码)。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。这样就very nice啦

5、在计算机内存中,统一使用unicode编码,而文本通常保存为utf8,所以在编辑文本的时候,从文件读取的utf8字符转换为unicode到内存,编辑完成的时候再把unicode转换为utf8然后保存到文件。

9、总结

1、python2的.py文件默认是使用ascii编码的,而python的.py文件默认是使用utf8编码的,如果文件中有中文,我们最好在文件头部写上# -- coding: utf8 --,有时候utf8不够全部中文,要用# -- coding: gbk --
2、str转换为bytes用encode()函数,传入编码参数的字符串。bytes转换为str用decode()函数,参数可传可不传。
3、str和bytes不能连接和比较。
4、 定义非ascii码的bytes时,必须使用如 bytes('中国','gbk') 来转码。

参考:
1、https://www.cnblogs.com/itech/archive/2011/03/28/1997878.html
2、https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

你可能感兴趣的:(python的字符串)