李成笔记网

专注域名、站长SEO知识分享与实战技巧

python3.x编码解码unicode字符串


1 python3.x编码解码unicode字符串


python的ASCII码范围为[0,127],非ASCII码范围大于127.

通过str.encode(encoding)和bytes(str,encoding)根据编码名将字符串编码为原始字节。

通过bytes.decode(encoding)和str(bytes,encoding)根据编码名将原始字节解码为字符串。

gbk编码中,1个汉字表示2个字节,utf-8编码中,1个汉字表示3个字节。

1个字节用2位16进制表示。编码和解码必须送编码名encoding。

‘\xNN’为两个十六进制,表示1个字节,

’\uNNNN’为unicode转义,表示四个十六进制位,编码1个2字节(16位)字符码,

’\UNNNNNNNN’为unicode转义,表示八个十六进制位,编码1个4字节(32位)字符码,

2个16进制对应1个字节。

注意,2字节用小u(\u),4字节用大U(\U)。

1.1 编码ASCII文本

ASCII文本编码是一种Unicode,存储为表示字符的字节值的一个序列。

ASCII码范围0-127.通过编码后,在字符前加b或B,打印值和字符相同。

 >>> ord('a')
 97
 >>> chr(97)
 'a'
 >>> s='abc'
 >>> s
 'abc'
 >>> len(s)
 3
 >>> [ord(c) for c in s]
 [97, 98, 99]
 >>> s.encode('ascii')
 b'abc'
 >>> s.encode('gbk')
 b'abc'
 >>> s.encode('utf-8')
 b'abc'
 >>> b_asc=s.encode('ascii')
 >>> b_gbk=s.encode('gbk')
 >>> b_utf8=s.encode('utf-8')
 >>> list(map(list,(b_asc,b_gbk,b_utf8)))
 [[97, 98, 99], [97, 98, 99], [97, 98, 99]]

1.2 编码非ASCII文本

编码非ASCII字符(编码值大于127),需用十六进制或Unicode转义。

十六进制转义用于单字节,Unicode用于两个或四个字节。

示例

 >>> a,b=0xa5,0xa9
 >>> a,b
 (165, 169)
 >>> hex(a),hex(b)
 ('0xa5', '0xa9')
 >>> chr(a),chr(b)
 ('¥', '?')
 # \xNN 十六进制单字节格式
 >>> s1='\xa5\xa9'
 # \uNNNN Unicode 双字节格式
 >>> s2='\u00a5\u00a9'
 >>> s1,s2
 ('¥?', '¥?')
 >>> len(s1),len(s2)
 (2, 2)
 # \UNNNNNNNN Unicode 四字节格式
 >>> s3='\U000000a5'
 >>> s3
 '¥'

1.3 编码和解码非ASCII文本

描述

#

项目

描述

1

\xNN

2位16进制,表示单字节,用\x转义,表示ASCII文本的unicode

2

\uNNNN

4位16进制,表示双字节,用\u转义,表示非ASCII文本的unicode

3

\UNNNNNNNN

8位16进制,表示四字节,用\U转义,表示非ASCII文本的unicode

4

单字节

1个字节2位16进制

5

ASCII编码

范围[0-127]

6

非ASCII编码

范围大于127

7

gbk编码

1个汉字2个字节,1个字节2位16进制

8

utf-8编码

1个汉字3个字节,1个字节2位16进制

9

unicode文本

python3.x的字符串str为unicode文本

10

ord(c)

获取字符c的unicode编码,为整数

11

hex(i)

获取整数i的16进制

12

hex(ord(c))

获取字符c的unicode编码的16进制,用\u转义

13

str.encode(encoding)

根据编码名encoding将字符串str编码为原始字节,返回bytes类型数据,b或B开头

14

bytes.decode(encoding)

根据编码名encoding将原始字节解码为字符串,返回str类型数据

15

bytes(str,encoding)

根据编码名encoding将字符串str编码为原始字节,返回bytes类型数据,b或B开头

16

str(bytes,encoding)

根据编码名encoding将原始字节解码为字符串,返回str类型数据


示例

 >>> c1,c2='梯','阅'
 # \xNN 16进制单字节, \uNNNN 16进制双字节 , \UNNNNNNNN 16进制四字节
 >>> c1_hexstr,c2_hexstr=hex(ord(c1)),hex(ord(c2))
 # ord(c)获取c的unicode值,通过hex(i)获取unicode值的16进制
 >>> c1_hexstr,c2_hexstr
 ('0x68af', '0x9605')
 # \uNNNN 四位16进制表示的2个字节,1个汉字为2个字节的unicode
 # 每个字节的unicode 用\u 转义 原始字节
 >>> c1c2='\u68af\u9605'
 >>> c1c2
 '梯阅'
 >>> len(c1c2)
 2
 # ASCII 范围为[0,127]
 >>> c1c2.encode('ascii')
 Traceback (most recent call last):
   File "<pyshell#82>", line 1, in <module>
     c1c2.encode('ascii')
 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
 # 通过 编码名 gbk 的码表编码, 1个 汉字为2个字节 ,1个字节为2位16进制
 # str.encode(encoding) 根据编码名 将字符串编码为原始字节
 >>> c1c2.encode('gbk')
 b'\xcc\xdd\xd4\xc4'
 >>> '梯阅'.encode('gbk')
 b'\xcc\xdd\xd4\xc4'
 # 通过 编码名 utf-8 的码表编码,1个 汉字为 3个字节,1个字节为2位16进制
 >>> c1c2.encode('utf-8')
 b'\xe6\xa2\xaf\xe9\x98\x85'
 >>> type(c1c2.encode('utf-8'))
 <class 'bytes'>
 >>> bytes(c1c2,encoding='utf-8')
 b'\xe6\xa2\xaf\xe9\x98\x85'
 >>> gbk_c1c2_raw=b'\xcc\xdd\xd4\xc4'
 >>> utf8_c1c2_raw=b'\xe6\xa2\xaf\xe9\x98\x85'
 >>> len(gbk_c1c2_raw),len(utf8_c1c2_raw)
 (4, 6)
 # bytes.decode(encoding) 根据编码名 将原始字节解码为字符串
 >>> gbk_c1c2_dcd=gbk_c1c2_raw.decode('gbk')
 >>> utf8_c1c2_dcd=utf8_c1c2_raw.decode('utf-8')
 >>> gbk_c1c2_dcd,utf8_c1c2_dcd
 ('梯阅', '梯阅')
 >>> str(gbk_c1c2_raw,encoding='gbk')
 '梯阅'
 >>> len(gbk_c1c2_dcd),len(utf8_c1c2_dcd)
 (2, 2)


2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言