首页 > 其他分享 >[字符编码] 理论篇:常见字符集与编码方式

[字符编码] 理论篇:常见字符集与编码方式

时间:2023-12-22 21:02:40浏览次数:32  
标签:编码 UTF 字节 字符集 编码方式 ASCII

  • 作者: 丶布布


文章预览:

  • 一. 基本概念
  • 1、字符集
  • 2、编码字符集
  • 3、字符编码方式
  • 4、编码字符集与编码方式间对应关系
  • 二. 字符集与编码
  • 1、ASCII字符集&编码
  • 2、GBXXXX字符集&编码
  • 3、UCS字符集&编码
  • 4、Unicode字符集&编码
  • 5、ANSI编码
  • 6、源字符集编码
  • 7、可执行字符集编码
  • 三、总结



一. 基本概念

1、字符集

各种文字和符号的集合,包括各个国家文字、标点符号、图形符号、数字等。

2、编码字符集

所有字符以及对应代码值的集合。编码字符集中的每个字符都对应一个唯一的代码值。这些代码值就称为码点值(code point),可以看做字符在编码字符集中的编号。

常见的编码字符集:ASCII字符集GBXXXX字符集BIG5字符集Unicode字符集等。

3、字符编码方式

代码值转换为实际的存储字节序列的一种映射规则。

 编码字符集中只规定了字符的代码值并未规定具体如何存储,字符编码方式解决了字符在计算机中如何存储的问题。

常见字符编码方式:ASCII编码GBXXXX编码BIG5编码UTF-8编码UTF-16编码UTF-32编码等。

4、编码字符集与编码方式间对应关系

每种编码字符集至少对应一种字符编码方式,也可以对应多种编码方式。


二. 字符集与编码

1、ASCII字符集&编码

  ASCII字符集:即美国信息交换标准码,分为标准ASCII码和扩展ASCII码。

  • 标准ASCII:标准ASCII字符集共有128个字符,其中有96个可打印字符,包括常用的英文字母、数字和标点符号等,同时还有32个控制字符。
    编码方式:标准ASCII编码是采用7位编码方式,以1个字节存储一个ASCII字符,字节最高位为0,即00000000-011111110x00-0x7F
  • 扩展ASCII:由于标准ASCII字符集字符有限,往往无法满足实际需求,因此国际标准组织制定了在与标准ASCII规范相兼容的前提下将ASCII字符集扩充为8位代码的方法。
    每种扩充ASCII字符集可以扩充128个字符,这些扩充字符的编码均为最高位为1的8位代码。扩充的ASCII字符集即为扩展ASCII字符集,编码方式称为扩展ASCII编码。
    编码方式:常见的一种扩展ASCII为ISO-8859-1(也称为Latin-1)编码规范,用于支持部分欧洲语言
2、GBXXXX字符集&编码

中国汉字编码字符集以及后续扩展的一系列规范,包括GB2312-80GBKGB18030

  • GB2312-80:中国国家标准简体中文字符集,全称为《信息交换用汉字编码字符集-基本集》,包括了6763个常用汉字和682个全角的非汉字字符。
    编码方式:GB2312编码的另一种表示方法为EUC-CN,采用双字节编码,其中汉字的区码和位码各占一个字节,每个汉字占两个字节的存储空间。由于区码和位码的取值范围都为1—94,如果直接将其值作为存储值,会导致与ASCII码冲突,实际存储时将区码和位码分别加上0xA0的方式转换为存储码(也称为内码)。比如,汉字“啊”,区位码为1601(0x1001),其存储码为0xB0A10xB0 = 0x10+0xA00xA1 = 0x01 + 0xA1。编码范围:0xA1A1~0xFEFE
  • GBK:全称为《汉字内码扩展规范》。GBK兼容GB2312内码,是对GB2312内码的扩展,共收录了21003个汉字,883个字符,包含了简体、繁体中文以及日语、朝鲜语中的汉字。
    编码方式:GBK编码方式采用双字节编码,占用两个字节的存储空间,编码范围是0x8140~0xFEFE,不包括xx7F编码。windows对应代码页是CP936
  • GB18030:全称为《信息技术中文编码字符集》。GB18030完全兼容GB2312-80内码,基本兼容GBK内码,是目前最新的中国国家编码字符集标准,共收录了70244个字符,增加了对CJK统一汉字扩充A、CJK统一汉字扩充B以及少数民族文字等字符的支持。windows对应的代码页为CP54936。
    编码方式:GB18030编码采用变长多字节编码方式,包括1字节、2字节或4字节编码。单字节编码与ASCII码相同,双字节编码与GBK编码相同并增加了一些扩展,四字节用于扩充汉字的编码,第一、三字节的编码范围为:0x81—0xFE,第二、四字节的编码范围为:0x30—0x39
3、UCS字符集&编码

UCS即通用字符集,是ISO组织为了统一所有语言的文字和符号而制定的编码字符集。编码方式包括:UCS-2和UCS-4

  • UCS-2编码:针对UCS字符集的编码方式,采用双字节编码,只对基本平面(BMP)内的字符编码,即码点范围在0x0000~0xFFFF之间的字符编码。
4、Unicode字符集&编码

Unicode字符集是统一码联盟为了统一所有语言的文字和符号而制定的编码字符集。编码方式包括:UTF-8UTF-16UTF-32。Unicode字符集分为17个平面,其中0号平面为基本面(BMP)占用2字节,其他平面为辅助平面占用4字节。

  • UTF-8编码:UTF-8编码是针对Unicode字符集的可变长度字符编码。UTF-8兼容ASCII字符编码,对于ASCII字符只占一个字节,对于其他字符占用多个字节,其第一个字节从最高位开始,连续的二进制位为1的个数决定了编码占用的字节数,其余字节均以10开头,最多可占用6个字节。

    UTF-8中可以用来表示字符编码的实际位数最多为31位,即上表中x的个数;除去控制位剩余的x表示的位与Unicode中的码值是一一对应的,顺序也是一致的。
  • UTF-8带BOM与不带BOM:UTF-8是与字节序无关的,UTF-8可以带BOM也可以不带BOM,UTF-8带BOM是在字节流前边增加3个字节(0xEFBBBF)的前缀,用来说明编码格式为UTF-8。UTF-8不带BOM才是标准形式,带BOM是微软的习惯,在其他操作系统中一般都是采用不带BOM的形式。
  • UTF-16编码:针对Unicode字符集的编码方式,采用2字节或4字节长度编码,对于基本平面(BMP)内的字符编码采用2字节与UCS-2编码相同,超出基本平面的字符编码采用4字节编码。
    UTF-16与UCS-2编码在存储和传输时会有两种不同的字节序,即big endian(大端)和litte endian(小端)。大端序是高字节在前低字节在后,小端序是低字节在前高字节在后,比如汉字“啊”(U+554A),大端序为0x554A,小端序为0x4A55。
    为了说明字节流的顺序,需要在字节流前加上BOM(字节序标记),0xFEFF表示大端序,0xFFFE表示小端序。
    对应的编码名称有:UCS-2BE、UCS-2LE、UCS-2、UTF-16BE、UTF-16LE、UTF-16。

Unicode字符集UCS字符集(通用字符集)的编码表是相互兼容的,即每个字符在字符集中的位置(码位)是一致的。

5、ANSI编码

系统默认的编码方式,Windows可以在命令窗口中通过chcp指令查看系统默认编码。

  • 简体中文系统:ANSI编码为GBKGB2312
  • 英文系统:ANSI编码为ASCII码
  • 繁体中文系统:ANSI编码为BIG-5
6、源字符集编码

C++源字符集是指编写C++源程序的所有字符。源字符集编码主要指编写的源代码在磁盘中存储的编码格式。VS2015中可以通过“文件”-》“高级保存选项”-》指定当前源代码存储在磁盘中的编码格式

 VS2015源字符集编码格式默认是GBK格式,建议保存成UTF-8的格式。

7、可执行字符集编码

可执行字符集编码是C/C++语言的程序编译后字符所使用的编码方式,即对可执行文件.obj所使用的一种编码格式。编译器在编译时会将源代码中的字符常量和字符串常量转换为可执行字符集指定的编码方式。

 VS中可以使用#pragma execution_character_set(“编码方式”)预编译指令设置源文件中的可执行字符集使用的编码方式。

C++11中也可以直接使用u8、u、U前缀直接指定字符或字符串常量的编码方式。


三、总结

字符集

是否定长

编码方式

其他说明

标准ASCII


单字节7位编码

最早的奠基性字符集

扩展ASCII(ISO-8859-1(也称为Latin-1))


单字节8位编码

用于支持部分欧洲语言

GB2312-80


双字节编码

早期标准,不推荐在使用

GBK


双字节编码

对GB2312内码的扩展

GB18030


变长多字节编码

单字节编码和ASCII编码相同,双字节编码同GBK编码

并增加了一些扩展,四字节编码是用于扩充汉字的编码

UCS(通用字符集)


UCS-2编码(双字节编码)

ISO组织为了统一所有语言的文字和符号

而制定的编码字符集,Windows2000内部用UCS-2

Unicode字符集


UTF-8编码(1~4字节编码)

UTF-8兼容ASCII字符编码,对于ASCII字符

只占一个字节,对于其他字符占用多个字节

Unicode字符集


UTF-16编码(2/4字节编码)

Java和Windows XP/NT等内部使用UTF-16

Unicode字符集


UTF-8编码(1~4字节编码)

UTF-8兼容ASCII字符编码,对于ASCII字符

只占一个字节,对于其他字符占用多个字节

ANSI编码

系统默认的编码方式,不同系统中编码方式有所不同

源字符集编码

编写的源代码在磁盘中存储的编码格式,VS2015

源字符集编码格式默认是GBK格式,建议保存成UTF-8的格式。

可执行字符集编码

可用#pragma execution_character_set(“编码方式”)预编译指令设置VS源文件中的可执行字符集使用的编码方式


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。

姐妹篇:[字符编码] 实战篇:QT中文乱码的解决办法

标签:编码,UTF,字节,字符集,编码方式,ASCII
From: https://blog.51cto.com/u_16436086/8938570

相关文章

  • 视频监控LiteCVR可视化云平台接口支持获取视频帧率与编码格式
    2023年,AI视频监控技术迎来了显著的发展和成果,为安全领域和其他行业带来更智能、高效的解决方案,其中边缘AI发展也十分显著。边缘计算中AI的广泛应用将使设备能够在本地处理数据,而不必依赖云服务器,从而实现更快的响应时间和更强的隐私保护。 LiteCVR可支持设备通过国标GB28181、......
  • 使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的
    在前面随笔《在Winform应用中增加通用的业务编码规则生成》,我介绍了基于Winform和WPF的一个通用的业务编码规则的管理功能,本篇随笔介绍基于后端WebAPI接口,实现快速的Vue3+ElementPlus前端界面的开发整合,同样是基于代码生成工具实现快速的前端代码的生成处理。1、通用的业务编码......
  • 同事突然问我:异步网络请求编码的方法
    本文分享自华为云社区《异步网络请求编码》,作者:张俭。本文介绍常见的异步网络请求编码手法。尽管像golang这些的语言,支持协程,可以使得Programmer以同步的方式编写代码,大大降低编码者的心智负担。但网络编程中,批量又非常常见,这就导致即使在Golang中,也不得不进行协程的切换来满足......
  • des加密,url编码,url解码,des解密 DEMO
    des加密,url编码,url解码,des解密DEMOpackagecom.example.core.mydemo.des;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;importjava.net.URLDecoder;importjava.net.URLEncod......
  • 关于GreatSQL字符集的总结
    关于GreatSQL字符集的总结前言最近的SQL优化工作中经常遇到因字符集或校验规则不一致导致索引使用不了的问题,修改表的字符集或校验规则相当于把表重构,表中数据量大时,处理起来费时费力,希望应用开发者在设计之初时注意到此问题,让后期接手运维的小伙伴少一些负担。GreatSQL的字符集......
  • 【scikit-learn基础】--『预处理』之 分类编码
    数据的预处理是数据分析,或者机器学习训练前的重要步骤。通过数据预处理,可以提高数据质量,处理数据的缺失值、异常值和重复值等问题,增加数据的准确性和可靠性整合不同数据,数据的来源和结构可能多种多样,分析和训练前要整合成一个数据集提高数据性能,对数据的值进行变换,规约等(比如......
  • 【Verilog】编码规范-coding sytle
    目前所在单位并没有代码规范文档,以致于阅读代码很吃力,并且久而久之自己写的代码可读性也没法保证。在参考了很多资料后,决定按以下规范来写:一、命名规范1、文件命名a、每个文件中只包含一个module、class、package,文件名于文件内容名称应相同。 2、module、class、package、f......
  • 一些有趣和实用的Java开发技巧和编码技巧
    当涉及到Java开发技巧和编码技巧时,有一些有趣和实用的技巧可以帮你提高效率和代码质量。以下是一些示例:1.使用Lambda表达式List<Integer>numbers=Arrays.asList(1,2,3,4,5);//使用Lambda表达式计算偶数的总和intsum=numbers.stream().(n->n%20......
  • 更改Oracle字符集
    1、selectuserenv('language')fromdual; --查询字符集 2、shutdownimmediate; 关闭数据库实例 3、STARTUPMOUNT; --挂载  4、(依次执行以下命令)ALTER SESSION SETsql_TRACE=TRUE;ALTERSYSTEMENABLERESTRICTEDSESSION;ALTERSYSTEMSETJOB_QUEUE......
  • 异步编码规范
    异步编码规范手写promisepromiseA+规范asyncawait原理generator--忽略Promise1.特点1.1状态不可逆转==》不可从一个状态变为另外一个状态promise的方法finallyfinally方法没有参数,也不会改变Promise的状态,它只是在Promise结束时提供了一个通知机制,让......