高中信息技术ython重难点:字符编码暴力都不会的蒟蒻

编码(Encoding)是信息按照某种规则或格式,从一种形式转换为另一种形式的过程。解码是编码的逆过程。计算机对信息进行存储、加工、传递等处理,实际上是对信息的载体——数据进行处理。数据的表现形式可以是文本、图形、图像、声音、视频等,但不管是哪种形式的数据,最终存储在计算机中的都是经过一定规则编码后的二进制数字。

ord()函数

ord函数以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值

TZOJ5885参考代码

chr函数

chr() 用一个范围在256内的整数作参数,返回一个对应的字符。

5889参考代码

你可以尝试下以下题目

计算机中的汉字是采用二进制进行编码的。汉字编码分为外码、交换码、机内码和字形码。外码:又称输入码,是用来将汉字输入到计算机中的一组键盘符号。常用的输入码有拼音码、五笔字形码等。交换码:又称国标码,是和别的计算机交换信息时使用的编码。机内码:根据国标码的规定,每一个汉字都有确定的二进制代码,在计算机内部汉字代码都用机内码,在磁盘上记录存储汉字代码也使用机内码。它们的集合就叫字符集。字形码:又称输出码、汉字字模,把二进制的汉字编码还原为可视的图形,将其显示出来,它们的集合又叫字库。

GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。使用GB 2312时采用EUC-CN(Extended Unix Code)储存方法,以便兼容于ASCII。ASCII取值范围00H~7FH,两个连续的大于7FH的字符连接在一起就表示汉字。同时,GB 2312收录了包括一般符号、数字、希腊字母、日文假名、俄文字母等在内的682个字符。ASCII码内本来就有的标点、数字、字符等在GB 2312中依旧被编码了,我们把他们称为全角字符,ASCII内就叫做半角字符,他们在计算机显示是不一样的,全角字符往往要宽一点。

GB 2312中虽然已有6763个汉字,但是像有些生僻字"珽"以及繁体字"甦"等均无法显示。如果系统所用的是GB 2312,遇到这些字往往不能显示。还有1万多个汉字和需要编码,于是人们就想到了扩充,发布了《汉字内码扩展规范》,简称GBK(国标扩展)。GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准(国际标准组织ISO公布的通用字符集UCS),,它与 Unicode 组织的 Unicode 编码完全兼容。第一个字节还满足大于7FH,第二个字节范围为40H到FEH。使用Python查看其gbk内码时把上文代码中的encode设为gbk即可。

使用Python代码可以查到每个字符的Unicode符号值。

Unicode字符集只规定了字符与码表的一一对应关系,却没有规定该如何实现,因此这个字符集有多种实现方式(UTF-8,UTF-18,UTF-32),常见的实现方式是UTF-8。UTF-8采用变长的编码方式实现,其节省空间,兼容ASCII标准的优点, 在互联网上使用最广的一种Unicode的实现方式。

UTF-8 的编码规则很简单,只有二条:1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。2.对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Python代码依旧可以查出其utf-8编码值

汉字的长度从2字节变为3字节了,所以实际在网络传输中还是会使用其Unicode值进行传输的,而且我们也不知道用户使用什么编码,比如json中汉字为\u+四位十六进制数。

也可以使用Python内置的base64模块

如果原始的字节数不是3的倍数,比如4字节(剩余1字节)或者5字节(剩余2字节),则需要再末尾处理,一共可以分为2种情况。1.如果剩余1字节,需要补2字节(16bit)才是3的倍数。也就是要则补16个0,加上前面剩余的1字节(8bit),一共是24个bit,其中24个bit的前12bit(2*6)构成两个base64字符,剩下的12bit(2*6)全部是0,用两个等号 == 表示。2.如果剩余2字节,需要补1字节(8bit)才是3的倍数。也就是要则补8个0,加上前面剩余的2字节(16bit),一共是24个bit,其中24个bit的前18bit(3*6)构成三个base64字符,剩下的6bit(1*6)全部是0,用一个等号 = 表示。

计算机表示数字数字非常方便,但是遇到字符却不太好表示,发明计算机的美国人使用ASCII码表示英文以及控制字符等。等到中国人要用时,并没有我们的汉字,国家标准化管理委员会发布了GB 2312,但是其囊括汉字有限,微软推出了GBK。国家标准化管理委员会又发布了GB 18030,完全兼容GBK。后来发布的均兼容之前的,所以只要是上述出现的编码,使用GB 18030就不会出现乱码了。

每个国家都可以自己制定一套编码自己使用,为了世界不同语言的可以交流,我们发明了Unicode字符集。Unicode为了包含所有文字,使用更多位的字节的表示。对于有些文字使用多字节是比较浪费的,比如数字1,在ASCII码中使用一个字节就能够表示,在Unicode中有可能就是多字节表示,非常浪费存储。UTF-8是Unicode的一种实现方式。实际情况使用变字节的来表示文字。使用1~4个字节表示一个字符,根据不同的字符而变化字节长度,当字符在ASCII 码的范围时,就用一个字节表示,而一个中文字符占3个字节。这个和我们中文GB的编码是不同的,所以会出现乱码。不过UTF-8编码也兼容ASCII码,所以里面的英文是可以正常显示的。

THE END