• 字符集编码


    写在前面:

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

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

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

    目录

    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

     

      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

      把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

     
  • 相关阅读:
    牛客寒假算法基础集训营1 C 小a与星际探索(思维+异或)
    牛客寒假算法基础集训营4 E Applese 涂颜色
    Python的range()函数用法
    R语言读取XML数据
    R语言如何读取.csv文件
    反转链表
    HashSet HashTable HashMap 区别
    输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
    Activity生命周期之我见
    左旋转字符串
  • 原文地址:https://www.cnblogs.com/Antigonae/p/10230833.html
Copyright © 2020-2023  润新知