欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

python第五话:字符编码

时间:2023-05-22

目录

ASCII——英文

GBK——中文

Unicode——各国语言都有

UTF-8——节省空间 

计算机通用的字符编码工作方式

 常用编码介绍一览表

编码与解码


ASCII——英文

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。统一规定了常用符号用哪些二进制数来表示。

ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
  0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
  32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;
  65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

来自ASCII是什么

GBK——中文

GBK全称《汉字内码扩展规范》,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字。

来自html中文网

Unicode——各国语言都有

统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode把所有语言都统一到一套编码里,避免了乱码问题。

Unicode有两个特点:

1.支持全球所有语言

2.可以跟各种语言的编码自由转换

UTF-8——节省空间 

UTF是为Unicode编码设计的一种在存储和传输时节省空间的编码方案。

为了优化Unicode占的空间,规定:

        英文占1个字节

        西欧占2个

        中文占3个

因此,UTF-8也称为可变长的编码,一般存到文件里或者网络发送时用UTF-8,但是在内存里,仍然是Unicode。这是python3的特点;

但在python2中,内存里的字符默认是ASCII;

mac、Linux默认系统编码是UTF-8;

Windows中国版,默认是gbk。

   UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。 UTF-8最大的一个特点,就是它是一种变长的编码方式。 它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。

参考: www.zhihu.com/question/23374078

计算机通用的字符编码工作方式

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

 常用编码介绍一览表

编码与解码

因为数据以01的形式(机器码)存储在内存中,对人类来说是不可读的,所以要解码;反过来人类要把可读的文字存储到内存中,需要编码为计算机可以使用的数据。

任意编码转换成Unicode的过程,都叫解码:

语法:str.decode(''字符串")

Unicode转到其他编码的过程,叫做编码:

语法:str.encode(''gbk")(以转化为gbk编码为例)

 

decode() 和 encode()

decode() 函数有两个可选的参数: bytes.deocde(encoding="utf-8", errors="strict") ,encoding指编码,不指定则使用默认使用utf-8编码,

error有三种取值:strict、ignore和replace,默认使用strict

strict 对于任何无法被解码的字符都抛出错误ignore 忽略无法被解码的字符replace 替换无法被解码的字符

(其它取值与codecs.register_error(name, error_handler)有关,不再讨论)

很显然后两者都不是什么好办法,最好的方法是让它抛出错误,然后再检查数据是否存在问题。

encode()与前者相反,encode()将字符串编码为字节,参数与前者相同。 因为汉字或其他语言文字需要两到三个字节来存储,字节类型的字面量表示只支持ASCII字符:

>>> b = b"你好,世界" File "", line 1SyntaxError: bytes can only contain ASCII literal characters.

所以我们需要encode()来获得ASCII之外的字符(比如汉字)的字节类型:

>>> s = "你好,世界">>> s.encode()b'xe4xbdxa0xe5xa5xbdxefxbcx8cxe4xb8x96xe7x95x8c'

                                                                                                                 来自橙叶博客



附:

进制转换:【最强干货】详解二进制,八进制,十进制,十六进制的相互转换

字节类型:

字节类型可以存储任意格式的数据,远远不限于文本,可以说图片、视频、音频等等,所以字节类型有更广阔的使用空间,是进行底层编程的不可或缺的工具。 字节类型转换为字符串类型的过程为解码,反之则是编码:

参考: www.orgleaf.com/3375.html

可以理解为,字节类型就是二进制格式,只不过为了易于理解和人类计算,用十六进制来表示。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。