Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说python2 字符串编码_python字符编码「建议收藏」,希望能够帮助你!!!。
前面一节课我们讲了进制的转换,这部分内容需要写的代码不是太多,不过需要多动笔计算练习练习。这节课我们开始讲字符编码。大家都知道,计算机中只认识0和1,那计算机中的字符是如何存储的呢?我们来看看本节的内容:
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。
前面讲了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等等。使用不同的编码看字符会出现“乱码”现象。
后来gb2312和BIG合并以后形成一个中文字符编码的超集,名字叫GBK。目前我们使用的Windows操作系统简体中文版中仍然使用的是GBK编码。
Python中的字符串类型很好用,但是文件读写、网络传输中,由于编码的问题我们无法直接使用字符串类型,我们要了解一个新的类型——二进制序列(bytes)类型。
如果内容是纯英文字母和数字,可以直接在字符串的引号前加字母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')
字符串转换为二进制序列时,我们需要告诉计算机,字符编码是什么。有两种方法可以转换:
方法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,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
请编写一个程序,输入一个字符串,计算出该字符串的密文。
1、A
2、C
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。