python2 字符串编码_python字符编码「建议收藏」

Python (67) 2023-09-09 08:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说python2 字符串编码_python字符编码「建议收藏」,希望能够帮助你!!!。

前面一节课我们讲了进制的转换,这部分内容需要写的代码不是太多,不过需要多动笔计算练习练习。这节课我们开始讲字符编码。大家都知道,计算机中只认识0和1,那计算机中的字符是如何存储的呢?我们来看看本节的内容:

一、ASCII码

ASCII码American Standard Code for Information Interchange的缩写。计算机最早是美国人发明的,英文中只需要使用英文字母、数字、特殊符号以及计算机的控制符。当时在他们看来,计算机中字符只需要100多个就够了,因此他们选择使用7位的二进制来表示字符的编码。为了预留一定的余量,最高位为0,正好凑满8位。组成了ASCII码。

因此,在计算机中一个二进制称为1比特(bit),八位的二进制称为1字节(byte)

我们看一下ASCII码的表:

十进制

八进制

十六进制

二进制

符号

中文解释

0

0

0

0

NUL

空字符

1

1

1

1

SOH

标题开始

2

2

2

10

STX

正文开始

3

3

3

11

ETX

正文结束

4

4

4

100

EOT

传输结束

5

5

5

101

ENQ

询问

6

6

6

110

ACK

收到通知

7

7

7

111

BEL

8

10

8

1000

BS

退格

9

11

9

1001

HT

水平制表符

10

12

0A

1010

LF

换行符 \n

11

13

0B

1011

VT

垂直制表符

12

14

0C

1100

FF

换页符

13

15

0D

1101

CR

回车符 \r

14

16

0E

1110

SO

移出

15

17

0F

1111

SI

移入

16

20

10

10000

DLE

数据链路转义

17

21

11

10001

DC1

设备控制 1

18

22

12

10010

DC2

设备控制 2

19

23

13

10011

DC3

设备控制 3

20

24

14

10100

DC4

设备控制 4

21

25

15

10101

NAK

拒绝接收

22

26

16

10110

SYN

同步空闲

23

27

17

10111

ETB

传输块结束

24

30

18

11000

CAN

取消

25

31

19

11001

EM

介质中断

26

32

1A

11010

SUB

替换

27

33

1B

11011

ESC

换码符

28

34

1C

11100

FS

文件分隔符

29

35

1D

11101

GS

组分隔符

30

36

1E

11110

RS

记录分离符

31

37

1F

11111

US

单元分隔符

32

40

20

100000

空格

33

41

21

100001

!

感叹号

34

42

22

100010

"

双引号

35

43

23

100011

#

井号

36

44

24

100100

$

美元符

37

45

25

100101

%

百分号

38

46

26

100110

&

39

47

27

100111

'

单引号

40

50

28

101000

(

左括号

41

51

29

101001

)

右括号

42

52

2A

101010

*

星号

43

53

2B

101011

+

加号

44

54

2C

101100

,

逗号

45

55

2D

101101

-

连字号或减号

46

56

2E

101110

.

句点或小数点

47

57

2F

101111

/

斜杠

48

60

30

110000

0

0

49

61

31

110001

1

1

50

62

32

110010

2

2

51

63

33

110011

3

3

52

64

34

110100

4

4

53

65

35

110101

5

5

54

66

36

110110

6

6

55

67

37

110111

7

7

56

70

38

111000

8

8

57

71

39

111001

9

9

58

72

3A

111010

:

冒号

59

73

3B

111011

;

分号

60

74

3C

111100

<

小于

61

75

3D

111101

=

等号

62

76

3E

111110

>

大于

63

77

3F

111111

?

问号

64

100

40

1000000

@

电子邮件符号

65

101

41

1000001

A

大写字母 A

66

102

42

1000010

B

大写字母 B

67

103

43

1000011

C

大写字母 C

68

104

44

1000100

D

大写字母 D

69

105

45

1000101

E

大写字母 E

70

106

46

1000110

F

大写字母 F

71

107

47

1000111

G

大写字母 G

72

110

48

1001000

H

大写字母 H

73

111

49

1001001

I

大写字母 I

74

112

4A

1001010

J

大写字母 J

75

113

4B

1001011

K

大写字母 K

76

114

4C

1001100

L

大写字母 L

77

115

4D

1001101

M

大写字母 M

78

116

4E

1001110

N

大写字母 N

79

117

4F

1001111

O

大写字母 O

80

120

50

1010000

P

大写字母 P

81

121

51

1010001

Q

大写字母 Q

82

122

52

1010010

R

大写字母 R

83

123

53

1010011

S

大写字母 S

84

124

54

1010100

T

大写字母 T

85

125

55

1010101

U

大写字母 U

86

126

56

1010110

V

大写字母 V

87

127

57

1010111

W

大写字母 W

88

130

58

1011000

X

大写字母 X

89

131

59

1011001

Y

大写字母 Y

90

132

5A

1011010

Z

大写字母 Z

91

133

5B

1011011

[

左中括号

92

134

5C

1011100

\

反斜杠

93

135

5D

1011101

]

右中括号

94

136

5E

1011110

^

音调符号

95

137

5F

1011111

_

下划线

96

140

60

1100000

`

重音符

97

141

61

1100001

a

小写字母 a

98

142

62

1100010

b

小写字母 b

99

143

63

1100011

c

小写字母 c

100

144

64

1100100

d

小写字母 d

101

145

65

1100101

e

小写字母 e

102

146

66

1100110

f

小写字母 f

103

147

67

1100111

g

小写字母 g

104

150

68

1101000

h

小写字母 h

105

151

69

1101001

i

小写字母 i

106

152

6A

1101010

j

小写字母 j

107

153

6B

1101011

k

小写字母 k

108

154

6C

1101100

l

小写字母 l

109

155

6D

1101101

m

小写字母 m

110

156

6E

1101110

n

小写字母 n

111

157

6F

1101111

o

小写字母 o

112

160

70

1110000

p

小写字母 p

113

161

71

1110001

q

小写字母 q

114

162

72

1110010

r

小写字母 r

115

163

73

1110011

s

小写字母 s

116

164

74

1110100

t

小写字母 t

117

165

75

1110101

u

小写字母 u

118

166

76

1110110

v

小写字母 v

119

167

77

1110111

w

小写字母 w

120

170

78

1111000

x

小写字母 x

121

171

79

1111001

y

小写字母 y

122

172

7A

1111010

z

小写字母 z

123

173

7B

1111011

{

左大括号

124

174

7C

1111100

|

垂直线

125

175

7D

1111101

}

右大括号

126

176

7E

1111110

~

波浪号

127

177

7F

1111111

删除

这张表大家做一个了解。我们需要记忆的主要有以下三个值:

数字0 → 0x30 → 48

字母A → 0x41 → 65

字母a → 0x61 → 97

数字和数字之间、字母与字母时间是按照顺序连续的。我们只要能记住这三个值,就可以计算出别的数字和字母的ASCII码的值。

在Python中,有两个函数分别用于计算字符的ASCII码,通过ASCII码的值计算对应的字符。分别是chr()函数和ord()函数,使用非常简单,我们直接看例子:

print(chr('B'))
# 66

print(ord(99))
# c

通过这两个函数,我们可以实现子母的移位。我们把字母C转换成它后面的字母,我们怎么写呢,只需要将ASCII码的值加1就可以了:

print(ord(chr('C') + 1))

同样的道理,大写字母转换成小写字母,即是ASCII码的值+32;小写字母转大写字母,即ASCII码的值-32。

二、初识Unicode、UTF-8、GBK等编码

前面讲了ASCII码的知识,大家看出来,英文在电脑中的编码是没问题了。但是计算机走向全世界时,问题来了,电脑中如何表示其他各国的语言呢?我们暂且不说别的国家的文字,就中文里面使用的汉字就多达几万个,再加上俄语的西里尔字母、阿拉伯语的字母等等。

为了保持全世界语言在计算机中统一的表示,人们制定了Unicode(万国码)的标准,确保了世界上所有的语言都能够使用统一的标准编码。

Unicode最早使用的是2个字节,奈何字符数量实在太多,最后扩展成了4个字节。

Python 3中字符串类型中的字符使用的就是Unicode。

Unicode虽然很好,但是却有很大的问题。英文字母使用ASCII码原本只要一个字节就能表示的,使用Unicode却需要4个字节,白白浪费了空间。尤其是在网络传输时,白白浪费了网络带宽。于是UTF-8编码方式就诞生了。

UTF-8是一种针对Unicode的可变长度字符编码,它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。在UTF-8中,英文字符仍然是1个字节,汉字占几个字节是不确定度,有可能2个字节、3个字节或者4个字节。

最后我们介绍一下在Unicode还没有被制定出来前制定出来的字符编码。Unicode是1991年开始制定的,在制定Unicode之前,各个国家都制定了各自的字符编码,以保证字符在计算机中的正常显示。如中国大陆的gb2312、香港台湾地区的BIG5、日本的SHIFT-JIS等等。使用不同的编码看字符会出现“乱码”现象。

python2 字符串编码_python字符编码「建议收藏」_https://bianchenghao6.com/blog_Python_第1张

乱码的示例

后来gb2312和BIG合并以后形成一个中文字符编码的超集,名字叫GBK。目前我们使用的Windows操作系统简体中文版中仍然使用的是GBK编码。

三、二进制序列类型

Python中的字符串类型很好用,但是文件读写、网络传输中,由于编码的问题我们无法直接使用字符串类型,我们要了解一个新的类型——二进制序列(bytes)类型。

3.1 二进制序列类型的创建

如果内容是纯英文字母和数字,可以直接在字符串的引号前加字母b,就可以将变量类型定义为二进制序列类型。

sentence1 = b'This is my book.'
sentence2 = b"This is my ruler."
sentence3 = b'''A: How old are you?
B: I\'m eleven.'''
print(type(sentence1))
# <class 'bytes'>
print(type(sentence2))
# <class 'bytes'>
print(type(sentence3))
# <class 'bytes'>

如果内容中包含非英文字符,我们在定义一个二进制序列类型时,需要制定它的字符编码:

sentence = bytes('好好学习,天天向上。', 'utf-8')

3.2 字符串和二进制序列的转换

字符串转换为二进制序列时,我们需要告诉计算机,字符编码是什么。有两种方法可以转换:

方法1:字符串的encode()方法、方法2:使用bytes()函数做类型转换。

str1 = "由俭入奢易,由奢入俭难。"
# 方法1
bytes1 = str1.encode('utf-8')

# 方法2
bytes1 = bytes(str1, 'utf-8')

二进制序列转换为字符串类型,可以使用bytes类型的decode()方法,同样要告诉计算机,二进制序列使用的是什么字符编码:

str1 = bytes1.decode('utf-8')

有人会问,为什么我们不能直接打印出bytes类型的值呢?如果是英文我们打印出来是没问题的,但是出现其他的文字,打印出来的内容我们是无法阅读的。我们看看上面的例子中bytes1打印出来是什么内容:

b'\xe7\x94\xb1\xe4\xbf\xad\xe5\x85\xa5\xe5\xa5\xa2\xe6\x98\x93\xef\xbc\x8c\xe7\x94\xb1\xe5\xa5\xa2\xe5\x85\xa5\xe4\xbf\xad\xe9\x9a\xbe\xe3\x80\x82'

所有的内容都是以转义字符开头,后面是十六进制的值。它代表着每个字符编码对应的十六进制的值。

这节课的内容主要以概念性的东西为主,大家需要记忆的是ASCII码中字符'0'、'A'、'a'的值以及字符串和二进制序列的转换的方法。

四、课后思考题

编程题

恺撒密码(英语:Caesar cipher),是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

python2 字符串编码_python字符编码「建议收藏」_https://bianchenghao6.com/blog_Python_第2张

请编写一个程序,输入一个字符串,计算出该字符串的密文。

五、上节课思考题答案

1、A

2、C

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复