【知识拓展】字符编码 {Unicode和GBK字符编码方案;UTF-8,UTF-16,UTF-32存储方案;char,wchar_t,char8_t,char16_t,char32_t字符类型}

一、Unicode和GBK字符编码方案

1.1 ASCII码

在这里插入图片描述

ASCII (American Standard Code for Information Interchange):美国信息交换标准代码基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 [1] 。

ASCII 码使用指定的7 位(标准ASCII码)或8 位(拓展ASCII码)二进制数组合来表示128 或256 种可能的字符。标准ASCII码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 [1] 。

1.2 Unicode万国码

在这里插入图片描述

统一码(Unicode),也叫万国码单一码,由统一码联盟开发,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。

统一码是为了解决传统的字符编码方案(ASCII)的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

大多数计算机采用美国标准信息交换码(ASCII码),它是表示所有大小写字母、数字、标点符号和控制字符的7位编码方案。统一码包含ASCII码,‘\u0000’到’\u007F’对应全部128个ACSII字符。在JAVA中可以使用统一码。

1.3 GBK国标字库

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification) ,由中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订。

编码方式:经实际测试和查阅文档,GBK是采用单双字节变长编码,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。

GBK要转utf-8必须先将其转换成unicode编码,然后再讲unicode编码存储为utf-8格式才行。GBK只是对汉字的国际编码格式,其实我个人觉得并没有什么前景(自从unicode编程流行以后)。


二、UTF-8,UTF-16,UTF-32存储方案

  • 其实unicode和GBK才是编码的值,这与计算机其实没有什么太多的关系,只是一组字符设定或者说是从数字和字符之间的逻辑映射的概念编码。而utf-8和utf-16是讨论的如何将unicode编码存储在计算机中以及如何在计算机之间传输。简单来说,unicode才是编码,而utf-8是存储方式。

  • UTF是Unicode Transfer Format的缩写,即把Unicode转做某种格式的意思。

  • UTF后的数字代表编码的最小单位(码元),如UTF-8表示最小单位1字节

2.1 UTF-8

  • UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种变长字符编码存储方案。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。

  • UCS字符U+0000到U+007F(ASCII)被编码为字节0x00到0x7F(ASCII兼容)。这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种编码方式下是一样的。

UTF8分成单字节、双字节、三字节、四字节模式 。UTF-8编码字符理论上可以最多到4个字节长:

在这里插入图片描述

正如上面所示,在uft-8编码其实得到的字节数不确定,可能是1个字节,也可能是3个字节。但utf-8最大的好处是和ASCII码兼容,存储英文字母都是一个字节,因此现在被广泛应用。

2.2 UTF-16

  • UTF-16是Unicode的其中一个使用方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长(2字节或4字节)的码元来表示,因此这也是一个变长字符编码存储方案
  • UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)储存,但UTF-16却无法兼容于ASCII编码

提示:在英文比较多的地方,我们用utf-8编码比较好,而在汉语或者其他国际字符比较多的情况下,我们用utf-16可以达到最小存储。

2.3 UTF-32

UTF-32是针对Unicode的一种定长字符编码存储方案,对每一个Unicode码位使用恰好32位元。其它的UTF格式则使用不定长度编码。因为UTF-32对每个字符都使用4字节存储,就空间而言,是非常没有效率的,使得UTF-32通常会是其它编码文章体量的二到四倍。虽然每一个码位使用固定长度的字节看似方便,其实它并不如其它Unicode编码使用得广泛。


三、char,wchar_t,char8_t,char16_t,char32_t字符类型

  • 类型 char、wchar_t、char8_t、char16_t 和 char32_t 是C++中的内置类型,可表示字母数字字符,非字母数字字形和非打印字符。

语法:

char     ch1{ 'a' };  // or { u8'a' }
wchar_t  ch2{ L'a' };
char16_t ch3{ u'a' };
char32_t ch4{ U'a' };

3.1 char类型

  • char 类型是 C 和 C++ 中的原始字符类型。 char 类型可用于存储 ASCII 字符集,以及多字节字符的单个字节,例如Unicode 字符集的 UTF-8 编码。 在 Microsoft 编译器中,char 是 8 位(1字节)类型。 默认情况下,char 类型的变量将提升到 int。

3.2 wchar_t类型

  • wchar_t 类型是实现定义的宽字符类型。 在 Microsoft 编译器中,它表示一个 16 位宽字符(2字节),用于存储编码为 UTF-16 的 Unicode

3.3 char8_t,char16_t,char32_t

  • char8_t、char16_t 和 char32_t 类型分别表示 8 位、16 位和 32 位宽字符。 (char8_t 是 C++20 中的新增功能,需要 /std:c++20 或 /std:c++latest 编译器选项。)编码为 UTF-8 的 Unicode 可以存储在 char8_t 类型中。 char8_t 和 char 类型的字符串称为“窄”字符串,即用于存储 Unicode 或多字节字符。 编码为 UTF-16 的 Unicode 可以存储在 char16_t 类型中,而编码为 UTF-32 的 Unicode 可以存储在 char32_t 类型中。 这些类型和 wchar_t 类型的字符串都称为“宽”字符串,但该术语通常特指 wchar_t 类型的字符串。

  • 在 C++ 标准库中,basic_string 类型专用于窄字符串和宽字符串。 字符的类型为 char 时,使用 std::string;字符的类型为 char8_t 时,使用 std::u8string;字符的类型为 char16_t 时,使用 std::u16string;字符的类型为 char32_t 时,使用 std::u32string;而字符的类型为 wchar_t 时,使用 std::wstring。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芥末虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值