字符集编码

写在前面:

  在输出字符和字符串的时候,如何才能达到理想的效果呢?

  这就需要了解计算机中的字符是怎样被储存以及调用的

  学习资料来自网络,标明出处

 

目录

  1. ASCII的编码

  2. ANSI编码标准

  3. UNICODE的编码

 

by romaniz

概念

  字符编码也称字集码,是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储

  在计算机技术发展的早期,如ASCII和EBCDIC这样的字符集逐渐成为标准。但这些字符集的局限很快就变得明显,于是人们开发了许多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码

——bia度百科

 

  编码,又称代码,是用预先规定的方法,将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。它在电子计算机、电视遥控和通讯等方面广泛使用

  在电子计算机中,将指令和数字实行编码后,适合计算机运行和操作。编码作为计算机书写指令的过程,是程序设计活动的一部分。在数字磁记录中,可按照一定的规则,进行输入信息序列向编码序列的过程转换。在遥控系统和通信系统中,采用编码步骤可提高传送的效率和可靠性

  将数据转换为编码字符,必要时又可编码成原来的数据形式

——bia度百科

 

  各个国家和地区所制定的不同ANSI编码标准中,都只规定了各自语言所需的“字符”。比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些ANSI编码标准所规定的内容包含两层含义:

  1. 使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”

  2. 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”

  各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常所说的“字符集”,比如:GB2312、GBK、JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义

  “UNICODE字符集”包含了各种语言中使用到的所有“字符”。用来给UNICODE字符集编码的标准有很多种,比如:UTF-8、UTF-7、UTF-16、UnicodeLittle、UnicodeBig 等

——bia度百科

 

  各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常所说的“字符集”,比如:GB2312、GBK、JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义

——bia度百科

 

 

时期

  • ASCII的编码

  American Standard Code for Information Interchange

  起步阶段

  美国(国家)信息交换标准(代)码,一种使用7个或8个二进制位进行编码的方案,最多可以给256个字符(包括字母、数字、标点符号、控制字符及其他符号)分配(或指定)数值

  虽然标准ASCII码是7位编码,但由于计算机基本处理单位为字节(1byte = 8bit),所以一般仍以一个字节来存放一个ASCII 字符。每一个字节中多余出来的一位(最高位)在计算机内部通常保持为0(在数据传输时可用作奇偶校验位)

  在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS),比如"Bob123" 在内存中为:

42

6F

62

31

32

33

00

B

o

b

1

2

3

\0

 

  ASCII码于1961年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码

  目前使用最广泛的西文字符集及其编码是 ASCII 字符集和 ASCII 码,它同时也被国际标准化组织批准为国际标准

 

  ASCII码划分为两个集合:

    128个字符的标准ASCII码

      标准ASCII码为7位

      其中95个字符可以显示,另外33个不可以显示

      基本的 ASCII 字符集共有128个字符,其中有96个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符

    附加的128个字符的扩充

      扩充ASCII码为8位

——Wikipedia

  单字符编码最简单的编码规则,每一个字节直接作为一个UNICODE字符

  比如[0xD6,0xD0]这两个字节,通过iso-8859-1转化为字符串时,将直接得到 [0x00D6,0x00D0]两个UNICODE字符,即 "ÖÐ"

  反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符

 

  由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。为此,国际标准化组织又制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将ASCII 字符集扩充为8位代码的统一方法。ISO陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符的编码均为高位为 1 的 8 位代码(即十进制数 128~255 ),称为扩展ASCII码,见下ANSI编码

——bia度百科

 

  • ANSI编码标准

  American National Standards Institute 美国国家标准学会

  本地化

  为使计算机支持更多语言,通常使用0x80~0xFF范围的2个字节来表示1个字符,使用0x80~0xffff来编码,即扩展的ASCII编码。比如:汉字 '中' 在中文操作系统中,使用[0xD6,0xD0]这两个字节存储

  不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码

  在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码

  在使用ANSI编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符

    比如,"中文123" 在中文Windows 95内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:

D6 D0 CE C4 31 32 33 00
1 2 3 \0

  把UNICODE字符串通过ANSI编码转化为“字节串”时,根据各自编码的规定,一个UNICODE字符可能转化成一个字节或多个字节
  反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如[0xD6,0xD0]这两个字节,通过GB2312转化为字符串时,将得到[0x4E2D]一个字符,即 '中' 字

 

  ANSI编码标准有:

    GB2312

    BIG5

    Shift_JIS

    ISO-8859-2

    ……

 

  ANSI编码的特点:
  1. 这些“ANSI的编码”都只能处理各自语言范围之内的UNICODE字符
  2. “UNICODE字符”与“转换出来的字节”之间的关系是人为规定的

 

  不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中

 ——bia度百科

 

  • UNICODE的编码

  国际化 

  为了使国际间信息交流更加方便,国际组织制定了UNICODE字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求

  UNICODE又称为统一码、万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等,于1990年开始研发,1994年正式公布

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

 

  UNICODE的编码有:

  UTF-7

  UTF-8

  UTF-16

  UnicodeLittle

  UnicodeBig

  ……

 

  与“ANSI的编码”类似的,把字符串通过UNICODE的编码转化成“字节串”时,一个UNICODE字符可能转化成一个字节或多个字节
  与“ANSI的编码”不同的是:
    1. 这些“UNICODE编码”能够处理所有的UNICODE字符
    2. “UNICODE字符”与“转换出来的字节”之间是可以通过计算得到的

——bia度百科

 

  C++11在语言层面对Unicode做了提升,简单来说就是引入了char16_t和char32_t类型来明确UTF-16和UTF-32编码方案对应的存储类型
  在之前的标准中只有wchar_t一种类型来存储Unicode字符,在不同平台上它的字长还不一致(windows上2个bytes,linux上4个bytes),这样导致windows上对于多于2字节的字符在处理上存在问题,后来微软不得不提供了一些额外API去处理这些情况
  现在新的标准中明确了各种编码存储的字长,处理起Unicode更加明确简单了,与之对应的STL库中多了相应的std::u16string和std::u32string
 

——https://www.jianshu.com/p/8b87a05c23b1

 
posted @ 2019-01-07 00:28  Antigonae  阅读(393)  评论(0编辑  收藏  举报