ASCII码,Unicode,UTF-8,UTF-16,UTF-32之间到底是什么关系?

ASCII,扩展ASCII,GB2312,GBK,GB18030编码,Unicode编码,UTF-16编码,UTF-8编码之间的关系 ASCII编码:ASCII是美国标准信息交换代码(American Standard Code for Information Interchange)的简称。计算机是由美国人发明的,当他们在使用计算机的时候必然会面临一个问题,如何将自己国家使用的字母和字符存储在计算机中。于是他们先将经常使用的字符进行编号(比如65:A,66:B,67:C),得到ASCII字符集,ASCII字符集由128个字符组成,编码范围是0-127,具体见后面的ASCII字码表。由于计算机只能识别二进制信息,所以美国人就将美国字符的码 阅读详情

ASCII码,Unicode,UTF-8,UTF-16,UTF-32之间到底是什么关系?

  • ASCII码
  • 非ASCII码
  • Unicode
  • UTF-32
  • UTF-16
  • UTF-8
  • 小结

ASCII码

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。

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

ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

非ASCII码

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。

Unicode

Unicode 为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF (十六进制),有 110 多万,每个字符都有一个唯一的 Unicode 编号,这个编号一般写成 16 进制,在前面加上 U+。例如:“马”的 Unicode 是U+9A6C。

Unicode 就相当于一张表,建立了字符与编号之间的联系

它是一种规定,Unicode 本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。

有的人会说了,那我可以直接把 Unicode 编号直接转换成二进制进行存储,是的,你可以,但是这个就需要人为的规定了,而 Unicode 并没有说这样弄,因为除了你这种直接转换成二进制的方案外,还有其他方案,接下来我们会逐一看到。

编号怎么对应到二进制表示呢?有多种方案:主要有 UTF-8,UTF-16,UTF-32。

UTF-32

先来看简单的 UTF-32

这个就是字符所对应编号的整数二进制形式,四个字节。这个就是直接转换。 比如马的 Unicode 为:U+9A6C,那么直接转化为二进制,它的表示就为:1001 1010 0110 1100。

这里需要说明的是,转换成二进制后计算机存储的问题,我们知道,计算机在存储器中排列字节有两种方式:大端法和小端法,大端法就是将高位字节放到底地址处,比如 0x1234, 计算机用两个字节存储,一个是高位字节 0x12,一个是低位字节 0x34。

UTF-32 用四个字节表示,处理单元为四个字节(一次拿到四个字节进行处理),如果不分大小端的话,那么就会出现解读错误,比如我们一次要处理四个字节 12 34 56 78,这四个字节是表示 0x12 34 56 78 还是表示 0x78 56 34 12?不同的解释最终表示的值不一样。

我们可以根据他们高低字节的存储位置来判断他们所代表的含义,所以在编码方式中有 UTF-32BE 和 UTF-32LE,分别对应大端和小端,来正确地解释多个字节(这里是四个字节)的含义。

UTF-16

UTF-16 使用变长字节表示

① 对于编号在 U+0000 到 U+FFFF 的字符(常用字符集),直接用两个字节表示。
② 编号在 U+10000 到 U+10FFFF 之间的字符,需要用四个字节表示。

同样,UTF-16 也有字节的顺序问题(大小端),所以就有 UTF-16BE 表示大端,UTF-16LE 表示小端。

UTF-8

UTF-8 就是使用变长字节表示,顾名思义,就是使用的字节数可变,这个变化是根据 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从 1 到 4 个不等。

UTF-8 的编码规则是:

① 对于单字节的符号,字节的第一位设为 0,后面的7位为这个符号的 Unicode 码,因此对于英文字母,UTF-8 编码和 ASCII 码是相同的。

② 对于n字节的符号(n>1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10,剩下的没有提及的二进制位,全部为这个符号的 Unicode 码 。

举个例子:比如说一个字符的 Unicode 编码是 130,显然按照 UTF-8 的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是 0),所以需要两个字节(n = 2)。

根据规则,第一个字节的前 2 位都设为 1,第 3(2+1) 位设为 0,则第一个字节为:110X XXXX,后面字节的前两位一律设为 10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。

所以它的格式为 110XXXXX 10XXXXXX 。

小结

因此,简单点说,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,这点是ASCII码做不到的。
而UTF-32,UTF-16,UTF-8则是Unicode编码的几种方式。

ASCALL码表 ascall码表,方便查看acall码值,在编程中方便对照。 立即下载

相关推荐

KUKA-外部自动运行模板程序——个人设计模式&思路

用于说明KUKA与西门子PLC外部自动交互模板的设计思路与使用流程

qq_39024187的博客 5609

ASCII、Unicode和UTF-8、UTF-16、UTF-32的关系

ASCII码 ASCII码表 计算机中任何信息都是用0和1来表示的。但是现实世界各种信息如图像、视频、音频、语言文字却不是用0和1表示的。为了计算机能够更加智能,我们需要让计算机能够识别人类世界的信息,所以我们需要将图像、视频、音频、语言文字等信息转换成二进制(0和1)存储到计算机中,这一过程也称之为编码。 编码是信息从一种形式或格式转换为另一种形式的过程。 如果只有一位二进制,那么可以代表两种情况,即2^1=2,可能是0或1。 如果有两位二进制,那么就可以代表四种情况,即2^2=4,可能是00、

二木成林 1966

NVIDIA Jetson Orin DLA架构解析与AI推理优化实践

深度学习加速器(DLA)作为专用AI推理芯片,通过固定功能架构实现卷积、池化等神经网络操作的高效能比处理。其核心原理在于硬件级优化计算单元与数据流,相比通用GPU可提升3-5倍能效。在边缘计算场景中,DLA与GPU的异构协同成为关键,特别适合自动驾驶感知、机器人视觉等实时性要求高的应用。NVIDIA Jetson Orin平台通过结构化稀疏技术,在ResNet50等模型上实现近2倍性能提升。开发实践中需注意算子支持、精度校准等关键点,结合TensorRT工具链可充分发挥DLA在低功耗场景的独特优势。

weixin_32999557的博客 397

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

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

古韵悠长的博客 1万+

Mediapipe手势识别实战——基于关节角度计算实现动态手势分类

本文详细介绍了如何利用Mediapipe进行手势识别,通过计算手指关节弯曲角度实现动态手势分类。文章从基础原理出发,讲解了关节角度计算的数学方法,并提供了Python实现代码。同时,还分享了数字手势和OK手势的识别实战经验,以及性能优化和工程实践中的关键技巧,帮助开发者快速掌握实时手势识别技术。

weixin_26891599的博客 403

OpenMV识别颜色源码

【代码】OpenMV识别颜色源码。

dxt258013的博客 402

ASCII码对照表(十进制和十六进制)

表 A-1 DEC 多国字符集 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 ...

weixin_30362233的博客 2万+

unity中判断是否联网,判断网络状态的两种方式

unity中判断是否联网,判断网络状态的两种方式

wla2996gpy032的博客 1876

为什么mysql中不应该使用utf8编码

为什么mysql中不应该使用utf8编码 因为MySQL的utf8编码最多只能够存储3个字节的字符,而一般的utf8编码能够存储4个字节的字符。 也就是说对于中文他应该能够正常存储,但是对于一些需要占用4个字节的字符他就不能够处理了,例如emjoy符号。 虽然最多只能表示3个字节的utf8在一般的场景下并没有什么问题,但是最好还是避免使用mysql的utf8而使用utf8mb4 ...

weixin_43464294的博客 580

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一)详细介绍了3D-EM Full Wave Extraction全波S参数提取,下面以一个差分过孔结构进行实例分析,以下图为例。模式如何进行S参数提取和观测3D电磁场和远场实例分析(一)-差分过孔结构。是一个简单的4层板,top换层到bottom层的差分过孔结构。起始频率为100Mhz,截止频率为20Ghz,线性扫描。上面那根曲线是插损,下面那根线是回损。

weixin_54787054的博客 343

Unicode与UTF-8、UTF-16、UTF-32之间的关系

本文主要介绍了Unicode字符集如何使用UTF-8、UTF-16、UTF-32编码来存储。

CyrusCJA的博客 896

XRoboToolkit —— 基于 PICO 4 Ultra 的机器人遥操作方案(一)

视觉-语言-动作模型(Vision-Language-Action models)的快速发展催生了对大规模、高质量机器人演示数据集的迫切需求。尽管遥操作是数据采集的主要方法,但现有方法存在可扩展性有限、设置流程复杂以及数据质量不佳等问题。本文提出XRoboToolkit,这是一个基于OpenXR标准的跨平台扩展现实(XR)机器人遥操作框架。该系统具备低延迟立体视觉反馈、基于优化的逆运动学算法,并支持多种跟踪模态,包括头部、控制器、手部及辅助运动追踪器。

2506_90492529的博客 3306

Unicode 和 UTF-8、UTF-16、UTF-32之间的关系

编码

wangkaiming123456的专栏 591

Camera2Demo

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

你真的懂 Unicode 和 UTF-8 是什么关系吗?来看看这个就彻底懂了!

想必做过爬虫的同学肯定被编码问题困扰过,有 UTF-8、GBK、Unicode 等等编码方式,但你真的了解其中的原理吗?下面我们就来了解一下 Unicode 和 UTF-8 编码到底有什么关系。 要弄清 Unicode 与 UTF-8 的关系,我们还得从他们的来源说起,下来我们从刚开始的编码说起,直到 Unicode 的出现,我们就会感觉到他们之间的关系 ASCII码 我们都知道,在计算机的世界里,信息的表示方式只有 0 和 1,但是我们人类信息表示的方式却与之大不相同,很多时候是用语言文字、...

HappyMrSpring 474

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

字符集

ASCII 最早的字符编码,一个字节,0~127,其中0x00~0x19是控制字符,0x20~0x29是0~9,0x41~0x5a是A~Z,0x61~0x7a是a~z。 ASCII扩展码 对ASCII的扩充,一个字节,0~255,兼容ASCII。 GB2312 对汉字的扩充,两个字节,包括英文字符,六千多简体汉字加标点符号。 GBK 对GB2312的扩充,两个

zhinianchangmeng的博客 410

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

mysql efbbbf_字符集与字符编码

什么是ANSI字符集?这个不是固定字符集,如果在中文简体windows中,它代码字符集是gb2312,在繁体值代表是big5等等。为什么英文字符不会出现乱码?常见ascii码字符集是:128字符,对应编码值是:1-128,二进制表示是:00000001-01111111。它表示了所有常见英文数字,标点符号。其它字符集都是由ascii码字符集扩展而来,扩展了最高位由10000000开始,用多字节表示...

weixin_42515093的博客 543

ASCII、Unicode、GBK、UTF-8之间的关系

一、ASCII编码ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。...

change the world by python 2万+

从 ASCII 到 UTF-8 - Unicode 码的诞生与实现

最近我在整理过往笔记时,发现涉及到了 UTF-8、Unicode的相关内容,相信大家中的很多人和之前的我一样,在过去的很长一段时间里,并没有搞清楚什么是 Unicode、什么是UTF-8,于是就有了这篇文章,我将带大家梳理一下关于 Unicode 码的诞生与实现,用正确的姿势学习认识 Unicode 和UTF-8。

栗筝i的博客 3667

彻底搞清楚ASCII,Unicode和UTF-8之间的关系

转载自:https://blog.youkuaiyun.com/Deft_MKJing/article/details/79460485 前言 平时喜欢写东西,看博客,一直对编码有些懵,今天下午也不知道看到了什么,突然想了解下,就找到了这个文章,看完真的豁然开朗,这个必须留下来做纪念。 1.ASCII 我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因...

ydm东方旭日的专栏 1万+

字符编码:Unicode和UTF-8之间的关系

Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国...

Loreen 2万+

Java 中 char 和 Unicode、UTF-8、UTF-16、ASCII、GBK 的关系

关于这几种字符编码的关系,经过各种资料研究,总结如下图(请右键在新标签页打开查看或者下载后使用看图工具放大查看):1[0-127]A1-F7A1-A9XX7F4~6HEX由于只规定了表示符号的二进制代码,却没有规定如何存储这个二进制代码。所以如何存储有不同的实现。而就是针对的不同存储方式的具体实现。0-1271282340000~FFFF注意:很多资料和文章中将 UTF-8 和 UTF-16 都称为定长编码,但实际上它们是可变长编码的,例如一个中文汉字用 UTF-8 表示的话,就需要 3 个字节。

川峰的博客 2670

一文读懂Unicode,UTF-8,UTF-16/32,BOM

本文介绍了Unicode编码的来历、特点以及UTF-8/16/32的编码方式、优缺点,解释了大小端及BOM

m0_64826034的博客 2092
上一篇: Mac中eclipse如何进行断点调试(debug)
下一篇: 浅析各种编程语言对数组的不同用法(以java,python,C,C++,javaScript为例)
PickCake
博客等级 码龄7年 8粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值