字符集字符编码

字符集

字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。而字符集(Character set)则是多个字符的集合。

简单的说,字符集就规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。

字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集、Unicode字符集等。

对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表、编码字符集、字符编码

字库表

一套字符集不一定包含世界上所有的字符,每套编码规范都有自己的使用场景。

而字库表就存储了编码规范中能显示的所有字符,计算机就是根据二进制数从字库表中找到字符然后给到上层应用显示,相当于一个存储字符的数据库。

例如:几乎所有汉字都保存在GBK 字符集的字库表中。所以可以显示汉字,但法语,俄语并不在其字库表中,所以GBK不能显示法语,俄语等不包含在其中的字符。如图:

1

编码字符集

在一个字库表中,每一个字符都有一个对应的二进制地址,而编码字符集就是这些地址的集合。

例如:
在ASCII码的编码字符集中,字母A的序号(地址)是65,65的二进制就是01000001。我们可以说编码字符集就是用来存储这些二进制数的。而这个二进制数就是编码字符集中的一个元素,同时它也是字库表中字母A的地址。我们根据这个地址就可以显示出字母A。如图:

2

字符编码

字符编码即为:字符集合中的每个字符在计算机系统中存放(编码)和表示(解码)字符对应二进制数的方式。

因为计算机存储单位一般为字节,因此各种字符编码系统以字节为基础进行表示。

计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。

3

相应的解码过程如下:

4

乱码原因

通过上面字符编码的过程,当编码和解码不一致时,就会导致乱码出现。

例如:
现有一个txt文本(GB2312编码),使用QFile获取文本内容:

5

6

发现读取的内容乱码了。

原因是我们的数据来源:GB2312编码的文本,通过QFile::readAll()获取到元素二进制数据后,赋值给QString这里使用UTF-8解码(QString默认以UTF-8保存数据)GB2312的编码,所以导致乱码。

即:源数据是以GB2312编码保存的,而在程序中使用时却以UTF-8方式解码。

7

这里再明确转码操作即可正常读取:
8

9

10

最后补充下字符集种类及其对应编码。

字符集种类

根据每个字符集中的一个字符用几个字节表示,字符集可以分为以下三大类:
单字节字符集、多字节字符集(MBCS)、Unicode字符集

单字节字符集

单字节字符集,字符集中的每个字符只用一个字节表示。常见的单字节字符集有:

ASCII字符集(对应ASCII编码)

ASCII(对应ASCII编码):用一个字节的低7bit表示一个字符,范围从0x00 - 0x7F 共可以表示128个字符,包括英文大小写字母、数字。

EASCII字符集(对应EASCII编码)

EASCII(对应EASCII编码):ASCII扩展字符集, 使用一个字节的全部8bit表示字符,在原来基础上增加表示一些控制字符、特殊字符等。扩展后范围从0x00-0xFF共可以表示256个字符。

多字节字符集(MBCS)

ASCII只能表示127个字符,即使扩展后也只能表示256个字符,对于表示欧美国家的字符够用了,但是对于其他国家文字,比如中国的汉字,就显然不够用了。

因此其他国家为表示自己的字符集制订新的编码方案,主要方法是用多个字节表示一个字符。但是这些编码方案必须满足美国的ANSI标准,即要兼容ASCII字符集,任何新的字符集编码都必须保留0x00 - 0x7F的127个编码表示ASCII字符,其他字符的表示使用大于128(0x7F)的字节作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与 Leading Byte一起作为实际的编码。

所有符合ANSI标准的编码都称为ANSI编码,如:

GB2312字符集(对应GB2312编码)

GB2312字符集(对应GB2312编码):用一个小于0x7F的字节表示ASCII字符,用均大于0x7F的两个字节表示一个汉字,两个字节的编码范围为0xA1A1 - 0xFEFE,这个范围可以表示23901个汉字。

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。其中包括6763个汉字,其中一级汉字3755个,二级汉字3008个;包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

GBK字符集(GBK编码)

GBK字符集(GBK编码):表示方法和gb2312一样,只不过对两字节的编码范围进行了扩充,用0x8140 - 0xFEFE表示其他汉字,最多可以表示3万多个汉字。

GB18030字符集(GB18030编码)

GB18030字符集(GB18030编码):在GBK表示的字符集基础上进一步扩充,增加了少数民族的字符,是目前最全的中文字符集,它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。

GB18030最多可以用四个字节表示一个字符,用两个字节表示时与GBK兼容,扩充部分用四个字节表示,每个字节规定不同的编码范围,其编码范围是首字节0x81-0xfe、二字节0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。

GB2312、GBK、GB18030一脉相承,因此统称为GBK。

BIG字符集(BIG5编码)

BIG字符集(BIG5编码):Big5,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家标准,而只是业界标准。

Big5码使用了双字节储存方法,以两个字节来编码一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。高位字节的编码范围0xA1-0xF9,低位字节的编码范围0x40-0x7E及0xA1-0xFE。

各编码范围对应的字符类型如下:0xA140-0xA3BF为标点符号、希腊字母及特殊符号,另外于0xA259-0xA261,存放了双音节度量衡单位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E为常用汉字,先按笔划再按部首排序;0xC940-0xF9D5为次常用汉字,亦是先按笔划再按部首排序。

小结

以上这些字符集(GB2312字符集、GBK字符集、GB18030字符集、BIG5字符集)都符合ANSI标准,因此其对应的编码(GB2312编码、GBK编码、GB18030编码、BIG5编码)统称为ANSI编码。

从ANSI标准派生的字符集统称为ANSI字符集,每种ANSI字符集编码时使用的字节数不是固定的(例如gb2312用一个或者两个字节表示、GB18030用一个、两个或者四个字节表示。
),因此它们都称为MBCS(Multi-Byte Chactacter System,即多字节字符系统)

ANSI字符集汇总如下:
11

简单示例:

同一个文件,用Notepad++打开则显示的GB2312编码、用Windows记事本打开右下角显示的是ANSI编码(记事本未细分GBK、BIG5等编码,统称为ANSI)。

上面记事本显示乱码是因为我本地系统编码是BIG5,即记事本程序内部使用BIG5解码GB2312编码的内容,导致乱码。

12

对于如何判断文件的编码,因篇幅有限,后续也会详细讲解。

Unicode字符集

每个国家都制定一个符合ANSI标准的字符集,有可能同一个编码对应不同字符集中的不同字符,会造成乱码。

因此,将全世界的所有字符整理成统一的字符集,统一编码,所有国家都使用这个字符集就不会出现乱码问题,这就是Unicode字符集。

Unicode包含了全世界所有的字符,Unicode最多可以保存4个字节容量的字符。

也就是说,要区分每个字符,每个字符的地址需要4个字节。这是十分浪费存储空间的,于是,程序员就设计了几种字符编码方式,比如:UTF-8,UTF-16,UTF-32。

UTF-8编码

注意是字符编码不是字符集

UTF-8是一种变长的编码方案,使用 1~6 个字节来存储。

UTF-8 的编码规则很简单:如果只有一个字节,那么最高的比特位为 0;如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。

具体的表现形式为:
0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的
110xxxxx 10xxxxxx:双字节编码形式;
1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式;
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式。
xxx 就用来存储 Unicode 中的字符编号。

UTF-32编码

注意是字符编码不是字符集

UTF-32 是固定长度的编码,始终占用 4 个字节,足以容纳所有的 Unicode 字符,所以直接存储 Unicode 编号即可,不需要任何编码转换。浪费了空间,提高了效率。

UTF-16编码

注意是字符编码不是字符集

UTF-16编码介于 UTF-8编码 和 UTF-32编码 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。

对于 Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换,这跟 UTF-32 非常类似。

对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00~DFFF 之间的双字节存储。

小结

只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码。

另外,通常所说的Unicode编码为UTF16编码。

最后汇总图如下:
13

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot整合springbatch批处理

springboot整合springbatch实现批处理 简介项目搭建步骤 简介 项目搭建 参考博客【场景实战】Spring Boot Spring Batch 实现批处理任务,保姆级教程 步骤 1.建表 建表sql CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL C…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

牛客网面试题知识点记录-03

1.题目讲解重写后子类调用父类的方法总结:当子类重写了父类方法A,父类方法直接调用被重写的父类方法后,调用的是子类的重写的父类方法A。 class Test {public static void main(String[] args) {System.out.println(new B().getValue());}st…

Java的并发修改异常

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

【Proteus仿真】【STM32单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检测…

奈奎斯特定理

奈奎斯特定理是通信领域中重要的理论基础之一&#xff0c;它对于数字通信系统中的信号采样和重构具有至关重要的作用。在数字信号处理和通信技术中&#xff0c;奈奎斯特定理的应用不仅具有理论意义&#xff0c;还对通信系统的设计、优化和性能提升起着重要的指导作用。本文将以…

8868体育助力意甲博洛尼亚俱乐部 主帅被评为最佳

博洛尼亚俱乐部是8868体育合作球队之一&#xff0c;本赛季在意甲联赛中表现出色&#xff0c;目前以8胜7平2负的成绩排名第四&#xff0c;积31分。意大利媒体评选出的年度最佳主帅是莫塔&#xff0c;本赛季莫塔率领博洛尼亚连续战胜强敌&#xff0c;目前在意甲积分榜上排名第四&…

进阶学习——Linux系统中重点‘进程’

目录 一、程序和进程的关系 1.程序 2.进程 2.1线程 2.2协程 3.进程与线程的区别 4.总结 4.1延伸 5.进程使用内存的问题 5.1内存泄漏——Memory Leak 5.2内存溢出——Memory Overflow 5.3内存不足——OOM&#xff08;out of memory&#xff09; 5.4进程使用内存出现…

Algorithm-Left Edge算法

算法输入&#xff1a; 多个段&#xff0c;每个段由两个值表示&#xff0c;例如&#xff08;1&#xff0c;3&#xff09; 算法原理&#xff1a; 将多个段按照左边的值排序放到列表中遍历列表&#xff0c;不断选择没有重叠的段&#xff0c;直到列表遍历结束&#xff0c;将选择…

fineBI web组件传参

1、fineBI web组件传参 1.1、 Web组件- FineBI帮助文档 FineBI帮助文档1. 概述1.1 版本FineBI 版本HTML5移动端展现功能变动6.0--V11.0.83web组件适配移动端效果优化6.0.13-web组件支持传递参数 ${过滤组件https://help.fanruan.com/finebi/doc-view-143.html 1.2、自己做的例…

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时&#xff0c;将Excel转为TXT纯文本文件可以提高处理效率。此外&#xff0c;许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件&#xff0c;因此将Excel文件转换为TXT还可以简化数据导入过…

如何读取tif格式文件(基于PIL)

背景介绍 在许多机器学习的任务中&#xff0c;大多数图像类型的训练数据集会以tif的格式储存&#xff0c;在这种情况下&#xff0c;如何读取tif格式的数据就至关重要 tif格式 TIF&#xff08;Tagged Image File Format&#xff09;格式&#xff0c;也被称为TIFF&#xff0c;是…

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)

电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来&#xff0c;会有各…

生成式AI在自动化新时代中重塑RPA

生成式AI的兴起正在推动行业的深刻变革&#xff0c;其与RPA技术的结合&#xff0c;标志着自动化领域新时代的到来。这种创新性结合极大地提升了系统的适应性&#xff0c;同时也推动了高级自动化解决方案的发展&#xff0c;为下一代RPA的诞生奠定了坚实的基础。 核心RPA技术专注…

数据结构——二叉树四种遍历的实现

目录 一、树的概念 1、树的定义 1&#xff09;树 2&#xff09;空树 3&#xff09;子树 2、结点的定义 1&#xff09;根结点 2&#xff09;叶子结点 3&#xff09;内部结点 3、结点间关系 1&#xff09;孩子结点 2&#xff09;父结点 3&#xff09;兄弟结点 4、树…

船舶数据采集与分析在线能源监测解决方案

一、船舶在线能源监测应用前景 船舶在线能源监测在能源效率优化、故障诊断和预测维护、节能减排和环保监管、数据分析和决策支持以及自动化智能化等方面具有广阔的应用前景。随着船舶行业对能源管理和环保要求的不断提高&#xff0c;船舶在线能源监测技术将成为船舶运营和管理中…

华为端口隔离高级用法经典案例

最终效果&#xff1a; pc4不能ping通pc5&#xff0c;pc5能ping通pc4 pc1不能和pc2、pc3通&#xff0c;但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…

2020年认证杯SPSSPRO杯数学建模A题(第二阶段)听音辨位全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现&#xff1a; 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮&#xff0c;在平地上可以被水平推动或旋转&#xff0c;但不会歪斜)&#xff0c;这样的设备称为一个麦克风树。不同的麦…

imgaug库指南(二):从入门到精通的【图像增强】之旅

文章目录 引言前期回顾代码示例小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应…
最新文章