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的unicode编码,为整数
11 hex(i) 获取整数i的16进制
12 hex(ord©) 获取字符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)

相关推荐

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

    2023-12-29 22:44:06       58 阅读
  2. jmeter解决返回unicode编辑

    2023-12-29 22:44:06       57 阅读
  3. python字符串编码解码基础知识

    2023-12-29 22:44:06       56 阅读
  4. Python字符串编码解码

    2023-12-29 22:44:06       53 阅读
  5. python中json.dumps将中文变成unicode字符解决办法

    2023-12-29 22:44:06       30 阅读
  6. Python3 字符解码

    2023-12-29 22:44:06       41 阅读
  7. Python Unicode 系统

    2023-12-29 22:44:06       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 22:44:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 22:44:06       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 22:44:06       82 阅读
  4. Python语言-面向对象

    2023-12-29 22:44:06       91 阅读

热门阅读

  1. 【AI】人工智能爆发推进器之变分自动编码器

    2023-12-29 22:44:06       62 阅读
  2. UE5.1_移动端运行问题梳理

    2023-12-29 22:44:06       48 阅读
  3. 《网络安全面试总结》--大厂面试题目及经验

    2023-12-29 22:44:06       53 阅读
  4. LeetCode 2660. 保龄球游戏的获胜者

    2023-12-29 22:44:06       50 阅读
  5. 力扣200. 岛屿数量

    2023-12-29 22:44:06       52 阅读
  6. 中介者模式(Mediator)

    2023-12-29 22:44:06       58 阅读
  7. 未来编程语言的演进:迎接技术革新的挑战

    2023-12-29 22:44:06       55 阅读