Python基础(八)—编码详解(ASCII、GBK、Unicode、UTF-8等)、decode&encode

VMware vCenter 6.7证书过期急救指南:从503报错到完美修复的全流程 本文详细解析了VMware vCenter 6.7因STS证书过期导致503报错的根本原因,并提供了一套从诊断到修复的完整实战流程。内容包括使用checksts.py脚本检测STS证书状态,通过fixsts.sh脚本更新证书,以及利用Certificate-Manager全面重置所有过期证书,帮助管理员快速恢复服务并避免常见陷阱。 阅读详情

编码的发展

看了很多篇博客,感觉还是先从历史讲起比较好…

  • ASCII
    8位的字节一共可以组合出256(2的8次方),把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这种标准被称为:ANSI 的"Ascii"编码(American Standard Code for Information Interchange,美国信息互换标准代码)。这种标准使用了1个字节7位二进制表示,最高位(b7)用作奇偶校验位。而8位二进制的256种可能的字符称为扩展ASCII码(不再是国际标准)。
  • DBCS
    为表示汉字,出现了GB2312:小于127的字符的意义与原来相同(“半角"字符),但当两个大于127的字符连接在一起时,就代表一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),共7000多个简体汉字。GBK全称汉字内码扩展规范,在GB2312上扩容,增了近20000个新的汉字(包括繁体字)和符号。后面出现了GB18030,收入汉字70000余个,每个字可以由 1 个、2 个或 4 个字节组成(单字节ASCII、双字节GBK、四字节)。以上汉字标准统称他们叫做"DBCS”(Double Byte Charecter Set 双字节字符集)。
  • Unicode编码
    为解决国家之间的交流,ISO (国际标谁化组织)搞一个包括了字符集:Universal Multiple-Octet Coded Character Set,简称 UCS, 俗称 “UNICODE”。规定必须用两个字节,也就是16位来统一表示所有的字符,对于ascii里的那些“半角”字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码,如果不够ISO也已经准备了UCS-4方案,说简单了就是四个字节来表示一个字符。
  • 零碎知识
    • “字符"和"字节”:“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。
    • 奇偶校验:是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添0;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
    • Unicode:只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
    • 由于"半角"英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
  • 以上可以简化为下表:
系统内码说明系统
阶段一ASCII计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。英文 DOS
阶段二ANSI编码(本地化)为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。
比如:汉字 ‘中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。
在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
中文 DOS,中文 Windows 95/98,日文 Windows 95/98
阶段三UNICODE(国际化)为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Windows NT/2000/XP,Linux,Java

编码规则

  • 编码规则种类
    虽然以上规定了各类的字符集,有些却没有对应的编码规则去统一实现,例如:UTF-8是Unicode的实现方式之一。下面是介绍字符集对应的各类编码规则:
分类编码标准说明
单字节字符编码ISO-8859-1最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 “ÖД。
反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。
ANSI 编码GB2312,
BIG5,
Shift_JIS,
ISO-8859-2 ……
把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。
反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D] 一个字符,即 ‘中’ 字。
“ANSI 编码”的特点:
1. 这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。
2. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。
UNICODE 编码UTF-8,
UTF-16,
UnicodeBig ……
与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。
与“ANSI 编码”不同的是:
1. 这些“UNICODE 编码”能够处理所有的 UNICODE 字符。
2. “UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的
  • UTF-8
    • UTF-8是互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32。UTF-8的编码规则只有两条:
      • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
      • 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
        Unicode符号范围 | UTF-8编码方式
        (十六进制) | (二进制)
        --------------------±--------------------------------------------
        0000 0000-0000 007F | 0xxxxxxx
        0000 0080-0000 07FF | 110xxxxx 10xxxxxx
        0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
        0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 看起来utf-16更加节省资源,节省空间。但实际上,当时,互联网上绝大部分存在的资源都是英文的,英文在utf-16中也是2个字节,而在utf-8中则是1个字节。在当时,显然是utf-8更加节省资源。现在我们在中文世界里来比较他们,则是utf-16更加节省资源。
  • UTF-8出现的原因:unicode编码是用两个字节来存储字符,如果一篇文章中,大部分都是英文,使用unicode编码就会造成空间的浪费,对英文部分使用ASCII码只需要一个字节就可以了。这时候,utf-8解决了这个问题。utf-8是一种可变长的字符编码,当存储英文时只使用一个字节,节省了一半的空间,而存储中文字符时,长度还是不变。utf-8虽然压缩了存储空间,但是如果在内存中存储,使用utf-8却由于它的长度不固定,带来了很大的不便,使得在内存处理字符变得复杂。应对这个问题的解决策略是:在内存中存储字符时还是使用unicode编码,因为unicode编码的长度固定,处理起来很方便。而在文件的存储中,则使用utf-8编码,可以压缩内存,节省空间。这里一般有个自动转换的机制,即从文件中读取utf-8编码到内存时,会自动转换为unicode编码,而从内存中将字符保存到文件时,则自动转换为utf-8编码。

decode&encode

编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。如下图:
编码转换.png

  • 关于两者的正确理解
    • decode的作用是将其他编码的字符串转换成Unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成Unicode编码。
    • encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将Unicode编码的字符串str2转换成gb2312编码。
  • 注意事项:
    • s=‘中文’ 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。
    • 在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
    • 如果字符串是这样定义: s=u’中文’ 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。只需要直接使用encode方法将其转换成指定编码即可
    • 如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断isinstance(s, unicode) #用来判断是否为unicode

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(八)—编码详解(ASCII、GBK、Unicode、UTF-8等)、decode&encode

手把手教你用STM32F103C8T6驱动HUB75 LED点阵屏(附74HC595级联代码) 本文详细介绍了如何使用STM32F103C8T6开发板驱动HUB75接口的LED点阵屏,包括硬件连接、74HC595级联代码、时序控制及灰度显示实现。通过实战案例展示动态文字显示和性能优化技巧,帮助开发者快速掌握LED点阵屏驱动技术。 阅读详情

相关推荐

计算机保研/考研面试题——计算机组成原理篇

本文总结了985和华五学校习计算机保研/考研常问面试时的计算机组成原理题,欢迎点赞、收藏、评论、关注

安晴晚风的博客 7548

GBK与Unicode码表的区别以及decoder和encoder的作用

文章目录GBK与Unicode的区别encoder和decoder的区别实例用途参考链接 GBK与Unicode的区别 讲二者区别之前首先要明白什么是GBK,什么又是Unicode,他们是怎么表示的? GBK和Unicode都是码表,码表的作用就是将一个个的字符与数字对应起来,比如英文字母a所对应的数值是97。 除了这两个常见的码表外,最常见的还有ASCII表,GBK主要用来对汉字和英文字母编码,Unicode不仅可以对汉字编码,还可以对其他语言进行编码,是一个大一统的编码表。从字符编码的范围上讲ASCII

hjyp的博客 4344

【SEED Labs 2.0】V*N Tunneling Lab

本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。本实验工作量较大,但难度不大,重点在于搞清是谁发给谁,走的什么路径。另外,本次实验由于网络中的设备较多,修改了环境变量方便分清哪个窗口是哪个设备。这样操作起来就方便多了。...

Chenyang的博客 6981

python基本代码格式_python编码总结(编码类型、格式、转码)

本文详细总结了python编码。分享给大家供大家参考,具体如下:【所谓unicode】unicode是一种类似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。也就是它只是一种内部表示,不能直接保存。所以存储时需要规定一种存储形式,比如utf-8和utf-16等。理论上unicode是一种能够容纳全世界所有语言文字的编码方案。(其他编码格式不再多说)【所谓GB码...

weixin_32021363的博客 1904

《科研伦理与学术规范》 全部 习题_答案 2020年秋

科研伦理与学术规范 答案 文章目录科研伦理与学术规范 答案1. 第一章课后习题(必做) 答案1.1 第一章Demo2. 第二章课后习题(必做) 答案3. 第三章课后习题(必做) 答案4. 第四章课后习题(必做) 答案5. 第五章课后习题(必做) 答案6. 第六章课后习题(必做) 答案 # 每行5题 #写于2020.11.17 侵删 1. 第一章课后习题(必做) 答案 ABC, A, B ,D ,ABCD ABC, D, A, BCD, C D, D, 1.1 第一章Demo

羊老羊 25万+

vrep和matlab,使用Matlab与V-REP联合仿真 - Play V-REP with Matlab

OS: Win10 x64Matlab: R2016bV-REP: V-REP PRO EDU v3.5.0 下载、安装与支持V-REP操作基础V-REP仿真基础Matlab环境准备一个简单的例子对V-REP有一定了解的读者可以直接跳到第三节Matlab环境准备。下载、安装与支持V-REP提供Windows、Linux和MacOS三个平台的应用程序支持,任意平台都提供教育版和专业版两个版本。教育版...

weixin_42660494的博客 3211

Python encode()和decode()方法:字符串编码转换

Python encode()和decode()方法

m0_74309242的博客 1872

Ubuntu系统下STM32开发环境搭建:从零配置CubeMX、VSCode与OpenOCD调试实战

本文详细介绍了在Ubuntu系统下搭建STM32开发环境的完整流程,包括CubeMX、VSCode和OpenOCD的安装配置。通过实战教程指导开发者从基础环境准备到工程创建与调试,提供高效的嵌入式开发解决方案,并分享常见问题解决方法。

potato的博客 942

python中的类属性,类方法和静态方法

类属性 和 类方法 属于类对象 而不是这个类的某一个实例对象 该类所有的实例对象共享一份 直接可以通过类名.的形式进行访问 类方法第一个参数为cls cls引用类对象 @classmethod 注意不要通过 对象来对类属性进行修改 那么将给对象绑定一个同名的实例属性 静态方法 @staticmethod 静态方法的参数 即没有类对象 也没有实例对象 作为参数 python建议不要直接对对象的属性进行直接赋值和访问 不能对赋值数据进行检验合法性 如果用set和get方法话 无疑对调用造

lanjiakang的博客 270

深度解析:LPDDR5 Receiver 的挑战与应对

LPDDR5 的数据速率已经来到Tbit​DataRate1​≈156ps在6400Mbps时也就是说,。👉 这就是为什么成为 LPDDR5 的“标配”。

weixin_43199439的博客 211

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 155

python中binascii库和encode、decode的使用

参考: python中encode相关解释:https://zhuanlan.zhihu.com/p/33220501 编码格式科普:https://zhuanlan.zhihu.com/p/33220501 binascii官方文档:https://docs.python.org/zh-cn/3/library/binascii.html 其他: 基于PyQt5的上位机:https://gitee.com/aaronlai/PyQt5-SerialPort-Stable?_from=gite

bobwpppppppp的博客 1869

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 642

encode & decode 使用指南

encode & decode 使用指南 一、先抛结论 1. 所有 query 的拼接,= 后的字符串必须 encode 函数功能介绍 encodeURI() 函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码 (该字符的 UTF-8 编码仅为四转义序列)由两个 “代理” 字符组成)。 encodeURIComponent() 函数通过将一个,两个,三个或四个表示字符的UTF-8编码的转义序列替换某些字符的每个实例来编码 URI (对于由

zhan_lijian的博客 2915

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

encode()方法——编码字符串

在Python中提供了encode()方法,该方法的作用是将Unicode编码转换成其他编码的字符串,如图1所示。l encoding="utf-8":可选参数,用于指定进行转码时采用的编码,默认为utf-8,如果是简体中文,可以设置为gb2312或gbk(与网站使用的编码方式有关)。如果需要将字节类型的HTML代码写入文件时,首先需要设置open()函数中的“w”写入模式,然后再通过decode()方法对字节类型的字符串进行解码,最后再写入文件中。

橙子味冰可乐的博客 2287

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Decode详解

http://www.shiyanbar.com/ctf/1831 Decode: flag格式:ctf{} 0x25346425353425343525333525343325366125343525373725346425353125366625373825346425343425363725346225346625353425366225346225346425353425343525

Gunther的博客 1833

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MAVEN编码从GBK改为UTF-8

Maven编译源码出现错误:编码GBK的不可映射字符 原因:中文操作系统编码为GBK,MAVEN安装后默认使用系统编码GBK,导致在编译UTF-8格式的源代码文件时出现编码不匹配的问题。 处理步骤: 设置前: 设置windows环境变量: Key: MAVEN_OPTS Value: -Xms256m -Xmx512m -Dfile.encoding=UTF-8 设置后: 置Maven项目编码(POM.xml) //源码,输出,编译都是UTF-8 <project.build.sourceEnco

以码平川的博客 1139

Python 关于 encode与decode 中文乱码问题

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码...

weixin_30616969的博客 800

python中的encode()和decode()函数

对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串。由于学python没多久,昨天使用python的时候,就遇到这种问题,现在来深入研究下与之相关的encode()和decode()函数,和如何把如乱码般的字符串转成中文。encode()和decode()都是字符串的函数,可直接查看关

m0_38080253的博客 15万+

python ASCII编码

bytes >>> type(b'xxxxx') <class 'bytes'> >>> type('xxxxx') <class 'str'> bytes是byte的序列,而str是unicode的序列。 1、str 转换成 bytes 用 encode() 方法:(注意:这有个坑,str1.encode不加括号和加括号...

CVAIDL的博客 1801

python3 文本过滤与清理 处理文本成ASCII字符 encode()与decode()

将所有Unicode十进制数字字符,转换成ASCII版数字字符:import unicodedata ,sys digitmap = {c:ord('0') + unicodedata.digit(chr(c)) for c in range(sys.maxunicode) if unicodedata.category(chr(c)) == 'Nd...

anlian523的博客 1万+

UnicodeEncodeError: 'gbk' codec can't encode character ...

使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 这个问题。 网络上有很多类似的文件讲述如何解决这个问题,但是无非就是encode,decode相关的,这是导致该问题出现的真正原因吗?不是的。 很多时候,我

小米的博客 4万+

【Python基础】关于字符编码(ASCII,GB2312,Unicode,UTF-8,UTF-16,UTF-32),有这一篇就够了!

计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致’a’解析成’b’或者乱码。 1 基础知识 1.1 字符集(Charcater Set)与字符编码(Encoding) 字符集(Charcater Set或Charset):是一个系统支持的所有抽象

古韵悠长的博客 1万+

python开发接口故障码_Python接口开发的异常处理

我们在开发restful接口的时候,一定会经常遇到异常的情况,包括可预知的异常和不可预知的异常,我们要怎么处理这些异常,才能既优雅的写好代码,又能让程序接口健壮性更好呢?首先分析下,遇到错误的时候,我们有两种方法,可以把信息返回给客户端:遇到错误,直接返回一个jsonify的json信息给前端抛出一个错误,然后我们在定义错误的handler专门捕捉错误,然后把错误里面的信息,包括错误码,错误信息,...

weixin_39541767的博客 742

解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34233679的博客 282

python encode ascii_python中,为何输入print(“a”.encode(“ASCii”))出来显示的是b‘a’?...

来看看文档str.encode(encoding="utf-8",errors="strict")返回原字符串编码为字节串对象的版本。b'a'这种形式就是字节串,而不是你想要的二进制串。那么怎么才能得到一个字符的二进制表示呢?分两步,第一步,先得到这个字符的ascii码值,将其表示为整数;第二步,将这个整数打印成二进制字符串。这两步刚好都有内置函数ord()bin()ord(c)对表示单个 Uni...

weixin_39628063的博客 720
上一篇: Python基础(七)—输入输出(open、os、pickle)
下一篇: Python基础(九)—异常except、else&with、异常的名称层次
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值