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