首页 > 其他分享 >字符编码的相关介绍

字符编码的相关介绍

时间:2023-09-01 19:55:13浏览次数:34  
标签:编码 UTF 字符 字符集 介绍 Unicode ASCII

字符编码的介绍

  • 前提知识了解
  • 字符编辑的介绍
  • 字符编辑的发展
  • UTF-8的由来
  • 字符编码的应用
  • 编码和解码

前提知识了解

三大核心硬件

所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点

#1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的

#2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行

#3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘

文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法)

文本编辑器读取文件内容的流程

#阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)

#阶段2、文件编辑器会将文件内容从硬盘读入内存

#阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上

字符串编码的介绍

字符编码它的前提

# 字符编码它的前提:它只跟字符类型和文本类型相关,跟视频文件、音频文件、图片文件等无关
计算机内部只能够认识二进制01,计算机之所以能够认识各种各样的字符,那是因为计算机的内部维护着一张字符编码表

字符编码

字符编码(Character Encoding):字符编码是指一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。例如ASCII字符编码规定使用单字节中低位的7个比特去编码所有的字符,在这个编码规则下字母A的编号是65(ASCII码),用单字节表示就是0x41,因此写入存储设备的时候就是二进制的 01000001。每种字符集都有自己的字符编码规则,常用的字符集编码规则还有 UTF-8编码、GBK编码、Big5编码等。

aslt.jpg

字符编码的发展

一家独大

上个世纪60年代,美国制定了一套字符编码规则,对英语字符与二进制位之间的关系做了统一规定,这编码规则被称为ASCII编码,一直沿用至今。

ASCII编码一共规定了128个字符的编码规则,这128个字符形成的集合就叫做ASCII字符集。在ASCII编码中,每个字符占用一个字节的后面7位,最前面的1位统一规定为0。在ASCII编码中,0~31 是控制字符如换行回车删除等,32~126 是可打印字符,可以通过键盘输入并且能够显示出来。(下图是ASCII字符集中字符和码值的对应关系)
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。所以当ASCII码到欧洲的时候,一些欧洲国家就决定对ASCII编码进行适当的“改造”:利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。这个编码统称为EASCII(Extended ASCII)。

但是欧洲的语言体系有个特点:小国家特别多,每个国家可能都有自己的语言体系,语言环境十分复杂。因此即使EASCII可以表示256个字符,也不能统一欧洲的语言环境。

为了解决上面这个问题,人们想出了一个折中的方案:在EASCII中表示的256个字符中,前128字符和ASCII编码表示的字符完全一样,后128个字符每个国家或地区都有自己的编码标准。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

根据这个规则,就形成了很多子标准:ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。这些子标准适用于欧洲不同的国家地区。

大一统

ASCII码字符集,总共才能容纳256个字符,对于全世界各国语言来说,很难全部包含在内,所有后来就出现了Unicode字符集。

Unicode字符集是一个很大的字符集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。
需要注意的是,Unicode只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何编码如何存储。这就造成了两个问题:

第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?
第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
为了解决Unicode字符集存在的问题,就出现了UTF(Unicode Transformation Formats)系列的编码规则。UTF编码规则具体规定了Unicode字符集中的字符是如何编码的。

总结:Unicode是一个很大的字符集,这个字符集只规定了这个字符集中每个字符对应的码值是多少,但是这个字符集并没有规定具体的编码规则,具体的编码规则有UTF系列的编码规则实现。
文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符

# 英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字

# 中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字

# 日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字

UTF-8的由来

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码规则,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)
UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是:UTF-8编码是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度(UTF-8编码可以容纳2^21个字符,总共200多万个字符)。
再次强调一个概念:就是Unicode是一个字符集,这个字符集世界上所有的字符定义了一个唯一编码。其仅仅规定了每个符号的二进制代码,没有制定细化的存储规则。UTF-8、UTF-16、UTF-32才是Unicode的存储格式定义。

字符编码的应用

1. 如何解决乱码问题?
	你在写文件的时候使用的是什么编码,那么你打开的时候就使用对应编码解码就行

2. Python解释器版本不同代码的编码问题
	"""
		在python2中使用的编码表不是utf-8,而是ASCII码表
            # coding:utf-8
        
        """它使用的是ASCII码表"""
            # 在Python2 中如何定义中文字符
            s = u'你好'
            print s
	"""

编码和解码

由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode

编码

由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode

解码

把计算机能够读懂的数字转化为人类能够读懂的字符
 # 编码
    # res = '趁年轻,学技能,养活自己'
    res = '趁年轻'
    # print(res.encode('utf-8')) # b'\xe8\xb6\x81\xe5\xb9\xb4\xe8\xbd\xbb' bytes

                                         # b'\xe8\xb6\x81\xe5\xb9\xb4\xe8\xbd\xbb'
    # 解码
    res1 = res.encode('utf-8')
    print(res1.decode('utf-8'))  # 趁年轻

    """如果遇到解码的时候,你不指定使用什么编码进行解码,你就试:utf-8 gbk"""

    # 扩展
    res2 = 'hello world'
    print(res2.encode('utf-8'))
    # print(b'hello world')

标签:编码,UTF,字符,字符集,介绍,Unicode,ASCII
From: https://www.cnblogs.com/wolongnp/p/17672750.html

相关文章

  • 018 学习笔记-- 实现二维表头统计(存储过程+游标+行转列+字符串截取)
    实现下图类似效果统计 数据库设计如下  存储过程如下所示:USE[DBTEST]GO/******Object:StoredProcedure[dbo].[GetData]ScriptDate:2023-09-0116:56:01******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERproc[dbo].[GetData]asdeclare......
  • 5G工业网关常见应用场景介绍
    5G工业网关是指基于5G网络技术的工业物联网网关设备,用于连接和管理工业设备和各个物联网子系统。它可以实现数据采集、远程监控、远程控制和数据传输等功能,广泛应用于工业自动化、智能制造、智能交通等领域。以下是一些5G工业网关的应用场景:  1、工业自动化:5G工业网关可以与......
  • Java:commons-codec实现byte数组和16进制字符串转换
    (目录)commons-codec文档https://commons.apache.org/proper/commons-codec/https://mvnrepository.com/artifact/commons-codec/commons-codec坐标<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifact......
  • 剑指 Offer 48. 最长不含重复字符的子字符串
    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1:"abc",所以其示例2:"b"示例3:"wke""pwke" 提示:s.length<=40000使用滑动窗口,哈希表来记录:classSolution{publicintlengthOfLongestSubstring(Strings){HashMap<Ch......
  • 判断文件夹名称是否为日期格式字符串 判断字符串是否为日期,并且是否早于指定日期
    '''清洗工具-判断文件夹名称是否为日期格式字符串'''#写入函数代码块之前,先加载相应模块,生成相应默认参数#Falseif(x=='')or(xin[None,pd.NaT])or(type(x)!=str)#无论是否指定format,pd.to_datetime(pd.NaT)都输出NaT#无论是否指定format,pd.to_datetime(N......
  • Python中文版_Python中文版官方下载 中文版介绍
    python3软件介绍python是当今最流行的编程语言之一。它有广泛的领域和应用,从学习计算机科学的基础,到执行复杂或者直接的科学计算任务来创建游戏。它的高级应用甚至包含数据科学和量子计算。在新的版本中,python添加了独特且有价值的功能,同时删除了一些旧功能。我们可以将任何新软......
  • proteus下载-proteus8.7中文版下载「仿真软件」中文版介绍
    Proteus官方版是一款全球知名的EDA工具软件,同时Proteus官方版也是英国LabCenterElectronics公司研发推出的最新的版本,Proteus官方版不仅具备其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,可以说是目前最好的仿真单片机及外围器件的工具,目前已经深受国内单片机爱好者的追捧,......
  • 电路仿真软件Proteus中文版下载,Proteus2022最新版 中文版介绍
    ProteusPro仿真软件是LabcenterElectronics公司(中国总代理为广州风标电子技术有限公司)的EDA工具软件,是一款适用于单片机教学、单片机应用开发领域的专员人员使用的仿真软件。ProteusPro支持IAR、Keil和MPLAB等多种编译器,软件内的模型处理器支持多种类型的格式,是世界上著名单片机......
  • # yyds干货盘点 # 分享一个Python字符串替换的基础题目(上篇)
    大家好,我是皮皮。一、前言前几天在Python最强王者群【莫生气】问了一个Python字符串基础处理的问题,一起来看看吧。二、实现过程这里大家对于strip()函数理解不深刻的话,很容易犯迷糊,这里答案就是输出一个字符c。因为strip会把参数ab分开来一个个的删除,如果是strs.strip('abc')会把整......
  • Python的字符串操作——总结
    总结:1.f"{变量}" 格式化一个字符串2.索引和切片:  索引:从0开始的.[]  切片:s[start:end:step],end位置的数据永远拿不到3.相关操作:  字符串操作对原字符串是不发生改变的.  1.upper()在需要忽略大小写的时候  2.strip()可以去掉字符串左右......