字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

news2024/9/22 23:38:57

1 常见编码

1.1 单字节编码:ASCII

ASCII使用1个字节(8个bit)来记录一组常用字符,见下表:
在这里插入图片描述

例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。

注意上表中其实只使用了7个二进制位,最高位b8没有使用。

所以目前ASCII只使用7个二进制位保存128个字符,还有128个位置未使用。

1.2 单字节编码:ASCII扩展OEM字符集

对于ASCII的第一次扩展:OEM(IBM PC)字符集,实际上就是使用了ASCII后面的128个位置,还是单字节字符集。

下面列举两种常用的:

ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”
在这里插入图片描述

ISO/IEC 8859-2:1999,又称Latin-2或“中欧语言”
在这里插入图片描述
对于拉丁语国家,除了我们熟知的a-z、A-Z之外,还存在衍生拉丁字母:

Á	É	Í	Ó	Ú	Ý	À	È	Ì	Ò	Ù	Â	Ê	Î	Ô	Û	Ä	Ë	Ï	Ö	Ü	Ÿ
á	é	í	ó	ú	ý	à	è	ì	ò	ù	â	ê	î	ô	û	ä	ë	ï	ö	ü	ÿ

Ç	Ş	Ã	Õ	Ñ	Ą	Ę	Į	Ų	Æ	Œ	Ø	IJ	ẞ	Þ
ç	ş	ã	õ	ñ	ą	ę	į	ų	æ	œ	ø	ij	ß	þ

可以看到,对于拉丁语系国家,单字节可以覆盖所有字符,Latin编码足够使用了。

但是对于非拉丁语系国家,例如汉语,单字节编码的256个位置是远远不够的。

1.3 双字节编码:大五码、GB码

单字节编码在中文环境中显然是不够用的,中文区的标准编码是GB系列。

  • 大五码是早期繁体中文的事实标准,基本被GB码取代。
  • GB码初代没有包含繁体,到今天的国家标准GB18030已经囊括了基本所有中、少数民族、日、韩汉字。
    • 演进:GB2312(2字节)→扩展繁体字→GBK(2字节)→扩展少数民族中日韩等→GB18030国家标准(4字节)。
    • 注意GBK都是向下兼容的,即GB18030兼容GB2312,因为使用的编码位置没有重叠。

1.3.1 大五码

Big5码是一套双位元组字符集,使用了双八码储存方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分区中:

0x8140-0xA0FE保留给使用者自定义字元(造字区)
0xA140-0xA3BF标点符号、希腊字母、特殊符号,包括在0xA259-0xA261,安放了九个计量用汉字:兙兛兞兝兡兣嗧瓩糎。
0xA3C0-0xA3FE保留。此区没有开放作造字区用。
0xA440-0xC67E常用汉字(5401字),字集来源除教育部“常用国字标准字体表”所列4808字外,并优先收编国中、国小教科书中常用字587字及异体字6字。先按笔画再按部首排序。
0xC6A1-0xC8FE保留给使用者自定义字元(造字区)
0xC940-0xF9D5次常用汉字(7652字),字集来源除教育部“次常用国字标准字体表”所列6330字外,并筛选编入教育部“罕用国字标准字体表”表中使用频率较高之1320字。亦是先按笔画再按部首排序。
0xF9D6-0xF9DC七个倚天外字集的扩充字:碁銹裏墻恒粧嫺(此七字分别为“棋鏽裡牆恆妝嫻”之异体字)
0xF9DD-0xFEFE保留给使用者自定义字元(造字区)

1.3.2 GBK

字符有一字节和双字节编码,007F范围内是第一个字节,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。

之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81FE(也就是不含80FF),第二字节的一部分领域在407E,其他领域在80FE

具体来说,定义的是下列字节:

范围第1字节第2字节编码数字数
水准GBK/1A1A9A1FE846717
水准GBK/2B0F7A1FE6,7686,763
水准GBK/381A040FE (7F除外)6,0806,080
水准GBK/4AAFE40A0 (7F除外)8,1608,160
水准GBK/5A8A940A0 (7F除外)192166
用户定义AAAFA1FE564
用户定义F8FEA1FE658
用户定义A1A740A0 (7F除外)672
合计:23,94021,886

2 字符集标准

可以理解为标准是一套字符集的集合,根据本地化的规则选择使用哪个字符集。

注意这些标准互相是不兼容的。

2.1 ANSI

与字符集不同,另一个维度的概念是字符集标准:由于不同的地区定义了大量不同的字符集,就拿单字节编码的字符集来说,就有ASCII、latin等等,虽然前128个字符一样,但后128个字符就完全不同了。
标准协会选择了一些比较常用的单字节编码作为ANSI标准,ANSI不指定某一种具体的字符集,而是根据系统locale选择具体使用哪一种单字节字符集。

ANSI没有固定字符集。

2.2 ISO 8859-1

ISO 8859-1 也是一种编码标准,由欧洲开发。长度也是一个字节,前 0~127 与 ASCII 一致,剩下的128个字符大多是欧洲语言所使用的字符,所以可以认为ISO 8859-1是为欧洲语言所定制的一套编码标准。一般情况ISO 8859-1标准会使用Latin 1。

2.3 GBK

事实上我们使用的GBK、GB18030都是标准,但由于我们的标准只对应一套特定的字符集,所以可以认为GBK就是字符集。

3 大统一

字符集、标准种类繁多,但是无论使用哪一种字符集,都无法做到显示任意国家的字符,所以unicode字符集出现了。

3.1 unicode

unicode使用4字节共32个二进制位,为每个字符都确定了一个唯一的编码,由于整体搜索空间庞大,实际使用的量比较少。所以将整体分为了17组,叫做字符平面。平时使用0号平面即可覆盖大部分场景。0号平面也叫做基本多文种平面(Basic Multilingual Plane, BMP)。

from wiki:

在这里插入图片描述

部分0号平面的分布:在这里插入图片描述

3.2 字符码与字符编码解耦

强映射的问题

传统编码中,字符码与字符编码是完全绑定的,例如在ASCII中,'a’的字符码是97,'a’的字符编码也是97。

在输入’a’时,系统直接映射为0110 0001存入即可,这种强映射方式好处是使用简单,快捷。但缺点是不灵活,每个字符码编码出的结果是固定的,如果存在这样一个场景:unicode四个字节中,英文字母只占很少的一部分,如果客户只使用英文,unicode中永远只有1个字节的数据是有意义的,剩下三个字节都没用到,但是强映射的方式下,数据传输、存储只能用4个字节,造成非常大的浪费。

unicode将字符码与编码解耦

在unicode中,每一个字符保证有唯一字符码,将 字符码到存储二进制之间的“字符编码”过程独立出来,提供了三种编码方法:

  • UTF-8:使用1或2或3或4个字节。
  • UTF-16:使用2或4个字节
  • UTF-32:固定使用4个字节。
    在这里插入图片描述

例如a在UTF-16下编码为0x0061占用两个字节,在UTF-8下编码为0x61占用一个字节。

4 总结

需要注意字符集和字符编码是不同的。比如当我们提到“数据库使用的是unicode字符集”,这样的说法是错误的,数据库中的数据一定要具体到某一种字符编码,只提到字符集是没有意义的,例如数据库使用UFT-8编码。

  1. 字符集:字符和字符码的映射关系,例如在ASCII中a的字符码就是97,表示在字符集的97号位置上是字符’a’。
  2. 字符编码:字符与字节流的映射关系,例如在ASCII中’a’的字节流就是01100001,在UTF中根据编码方式的不同,可能是011000010000000001100001

名字解释:

  • Code Point = 字符码
  • Character Set = 字符集
  • Character Encoding = 字符编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring入门案例--DI入门案例

入门案例思路分析 (1)要想实现依赖注入,必须要基于IOC管理Bean DI的入门案例要依赖于前面IOC的入门案例 (2)Service中使用new形式创建的Dao对象是否保留? 需要删除掉,最终要使用IOC容器中的bean对象 (3)Service中需要的Dao对象如何进入到Service中?…

1682_尝试写一个shell(做个努力的小菜鸟)

全部学习汇总: GreyZhang/bash_basic: my learning note about bash shell. (github.com) 跋:看了一下,这个可能是我大约十年前的学习笔记了,脑海中都没有多少那时候的记忆痕迹了。然而,当初的一些时间消磨的确是给今天…

Android/SELinux 添加 AVC 权限

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 增加属性配置 在文件路径下增加了如下代码用于gc02m1的兼容倒置前置摄像头成像配置 //daisy if(MSM8909_SENSORS){ property_set("ro.camera.gc02m1", "1"); } /home/scooper/works…

go之基于rabbitmq的火山云服务器弹性伸缩管理程序

Author: wencoo Blog:https://wencoo.blog.csdn.net/ Date: 18/04/2023 Details:文章目录 项目背景项目功能模块实现configMq.jsonconfigECS.jsonconfigDB.json 完整代码打赏 项目背景 项目服务器不够用了,需要弹性伸缩服务器,准备使用火山的…

算法套路十——回溯法之子集型回溯

算法套路十——回溯法之子集型回溯 算法实例一:LeetCode17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不…

【Spring Boot】spring boot 项目的创建

目录 一.本地创建 二.官网创建 一:本地创建 1. 2. 3. 4. 5. 6. 选择相应的版本,并点击next 7. 8. 9. 二.官网创建 1. 点击链接进入官网 2. 3. 5. 6.

【进阶C语言】动态内存管理

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于C语言进阶系列,本专栏主要内容为数据的存储、指针的进阶、字符串和内存函数…

win10 专业版登录Microsoft账户提示:0x800704cf 错误代码——问题解决记录

win10 专业版登录Microsoft账户提示:0x800704cf 错误代码——问题解决记录 系统版本 版本 Windows 10 专业版 版本号 21H2 安装日期 ‎2021/‎5/‎7 操作系统内部版本 19044.2846 体验 Windows Feature Experience Pack 120.2212.4190.0 问题描述 曾经手动修改过…

《程序员面试金典(第6版)》面试题 10.11. 峰与谷(双指针,贪心思想)

题目描述 在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组&#xff0c…

网络原理IP协议

hi,大家好,小魏又来了,我们已经认识了UDP,TCP,现在来认识一下位于网络层的协议,IP 认识IP地址 1.地址管理 2.路由选择 在之前的讲解中我们已经认识到了网络层的IP协议,负责寻路操作 IP地址(Internet Protocol Address)是指互联网协议地址&#xff0…

【Java版oj】day35年会抽奖、抄送列表

目录 一、年会抽奖 (1)原题再现 (2)问题分析 (3)完整代码 二、抄送列表 (1)原题再现 (2)问题分析 (3)完整代码 一、年会抽奖 …

C++ 命名空间 输入输出 缺省参数 引用 函数重载

在学习C之前,我们要先知道C和C是向上兼容的,也就是说,在cpp文件中既可以写入C的代码,也可以写C的代码,在日常编写代码中,经常会出现C和C混编的情况。 此博客都是在 C 的缺陷的基础之上 整理 C 中对其的优化…

PyTorch 之 强大的 hub 模块和搭建神经网络进行气温预测

文章目录一、强大的 hub 模块1. hub 模块的使用2. hub 模块的代码演示二、搭建神经网络进行气温预测1. 数据信息处理2. 数据图画绘制3. 构建网络模型4. 更简单的构建网络模型本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 一、强…

机器学习——回归与聚类算法

线性回归 广义的线性模型 不仅是自变量是一次方的是线性模型,参数是一次方的也是线性模型,比如: 总结:线性关系的一定是线性模型,线性模型的不一定是线性关系。 损失函数 优化损失 求解模型中的w,使得…

SeNet论文解读/总结

此文章为深度学习在计算机视觉领域的图片分类经典论文SeNet(Squeeze-and-Excitation Networks)论文总结。 此系列文章是非常适合深度学习领域的小白观看的图像分类经典论文。系列文章如下: AlexNet:AlexNet论文解读/总结_alexnet…

uniapp-搜索配置

自定义搜索组件 1.定义组件的 UI 结构: <template><!-- 通过属性绑定的形式&#xff0c;为 .my-search-container 盒子和 .my-search-box 盒子动态绑定 style 属性 --><view class"my-search-container" :style"{background-color: bgcolor}&q…

《花雕学AI》23:中文调教ChatGPT的秘诀:体验测试与通用案例,解锁无限有趣玩法!

引言&#xff1a; 你有没有想过和一台智能机器人聊天&#xff1f;你有没有想过让一台智能机器人为你创作诗歌、故事或歌曲&#xff1f;你有没有想过让一台智能机器人陪你玩游戏、学习或社交&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定会对ChatGPT感兴趣。 ChatG…

Hystrix详解

前言 Hystrix基于Feign&#xff0c;想熟悉Hystrix&#xff0c;必须先熟悉Feign。 Feign&#xff08;简介和使用&#xff09;&#xff1a; Feign&#xff08;简介和使用&#xff09;_长头发的程序猿的博客-CSDN博客 Hystrix简介 hystrix对应的中文名字是“豪猪”&#xff0c…

Android开发 Camera2获取输出SurfaceTexture

目录 一、Camera2概述 1 Pipeline 2 CameraManager 3 CameraDevice 4 CameraCharacteristics 5 CameraCaptureSession 6 CaptureRequest 7 Surface 8 CaptureResult 三、Camera2的特性 1 Camera2 才支持的高级特性 2 Camera1 迁移到 Camera2 二、示例源码 一、Came…

Honggfuzz Linux arch_clone 源码阅读 (setjmp, clone)

Honggfuzz Linux arch_clone 源码阅读 &#xff08;setjmp, clone&#xff09; 阅读 Honggfuzz 系统架构相关源码&#xff0c;在创建子进程部分遇到了几个问题&#xff0c;经过研究得以解决&#xff0c;在此记录。 Source Code 代码节选自linux/arch.c&#xff0c;已添加注释&…