猫猫学编码

编码

在上一篇文章中,我遇到了关于swift中的emoj字符串的utf16.cout才能等于NSString.cout的神奇问题。处于对utf8的好奇以及编码知识的了解,我决定好好了解下编码这一个学问。
Swift5中String.count 与 NSString.length不相等:https://www.jianshu.com/p/f135cab4dd45

ASCII标准字符集

ASCII是计算机的第一个编码标准,是按照美国人的习惯定制的

  1. 用1个字节来表示,并且限制了最高位必须为0,所以只能表示2^7=128个不同字符。例如:

    • 大写字符A 在ASCII中用 0100 0001(二进制,最高位为0)表示,A在ASCII中的码位就是0100 0001, 10进制为65,16进制为0x41
    • 范围就是 0000 0000 -> 0111 1111 共128
  2. 分为可见字符和控制字符:

    • 32-126 代码可见字符,共计95个(abcd符号等可见的字符)
    • 0-31,127 代表控制字符,共计33个(回车,换行,退格等控制字符)

扩展ASCII字符集

一些欧洲国家在原有的ASCII上进行了扩展,也就是把第一位也用上了,将首位0变为1,这样就多出来了128个字符。这样扩展后的ASCII字符集就有256个字符了。

16位字符集

不管是老美的128个的ASCII,还是老欧的256扩展ASCII,这点数量对于我们中国的方块字来说都是不值一提的。。。 太少了
所以我们需要设计我们自己的字符集。

GB2312字符集(GB=国标)

使用分区管理,共计94个分区,每个区94个位,一共8836个码位

  • 01-09区收录除汉字外的682个字符。
  • 10-15区为空白区,没有使用。
  • 16-55区收录3755个一级汉字,按拼音排序。
  • 56-89区收录3008个二级汉字,按部首/笔画排序。
  • 88-94区为空白区,没有使用。

例如:“啊“在16区0排1位,用2字节表示为0xB0 0xA1 (0xB0=0xA0+16,0xA1=0xA0+1)(为啥要加A0呢,为了避开ASCII中的不可显示字符。)其实这里我也就是了解一下,感兴趣的话具体可以看维基百科

GBK

对GB2312进行扩充,把空位进行填充,形成了GBK编码。

GB18030

通过对GBK扩充,加入少数民族语言字符等,就形成了GB18030编码。

Unicode

  • Unicode,中文又称万国码、国际码、统一码、单一码,是计算机科学领域的业界标准。它整理、编码了世界上大部分的文字系统,使得电脑可以用更为简单的方式来呈现和处理文字。维基百科
  • ISO组织定制了通用字符集(英语:Universal Character Set, UCS)

UTF-8

  • UTF-8是对Unicode字符集的一种字符编码
  • 针对每个字节的前缀不同,对字符集中的有效码点进行编码,是一种可变长度的字符编码
码点的位数 码点起值 码点终值 字节序列 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6
7 U+0000 U+007F 1 0xxxxxxx
11 U+0080 U+07FF 2 110xxxxx 10xxxxxx
16 U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
21 U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

例如:
当我们在swift中打印utf8和unicodeScalars时候如下

"猫".utf8
▿ UTF8View("猫")
  - 0 : 231
  - 1 : 140
  - 2 : 171
"猫".unicodeScalars
▿ StringUnicodeScalarView("猫")
  - 0 : "\u{732B}"

unicodeScalars 是字符集的具体码位,可以用系统的科学计算器看一下:


那utf8的数怎么来的呢?

  1. 猫:u{732b}的码位是这样的:
    • 111 0011 0010 1011
  2. 根据上面的表,我们找到与对应的规则为第三排的:
    • 1110xxxx 10xxxxxx 10xxxxxx
  3. 将1的二进制码插入到2的x空位中得出:
    • 1110 0111 1000 1100 1010 1011
  4. 将3换算为10进制:
    • 231 140 171
  5. 宗上4步,我们就得出了我们在swift中显示的"猫".utf8的三个数字了。

简而言之,unicode是标准,他包含了utf-8、utf-16、utf-32这些编码。
也包含了ucs-2、ucs-4的这些字符集。

`
更多其他可以参考维基百科:

  • Unicode
  • 通用字符集
  • UTF-8
  • UTF-16
  • UTF-32
    `

PS

字节Byte

1字节(Byte) = 8位(bit)

1个16进制=4位:
0xf = 1111
所以通常我们1Byte(也就是8bit)会用两个16进制来表示:
0xff = 1111 1111
0x00 = 0000 0000

单位换算

单位 单位备注 低位兑换 低位备注
1Byte 1字节 8bit 8位(0000 0000 - 1111 1111)(0x00-0xff)
1KB 1千字节(Kilobyte) 1024字节 2的10次方字节(1KB=1024B)
1MB 1兆字节(Megabyte) 1024千字节 2的20次方字节(1MB=1024KB)
1GB 1吉字节(Gigabyte) 1024兆字节 2的30次方字节(1GB=1024MB)
1TB 1千吉字节(Terabyte) 1024吉字节 2的40次方字节(1TB=1024GB)

比特

二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据

  1. 计算机专业术语,是信息量单位,是由英文BIT音译而来。二进制数的一位所包含的信息就是一比特,如二进制数0101就是4比特。
  2. 二进制数字中的位,信息量的度量单位,为信息量的最小单位。数字化音响中用电脉冲表达音频信号,"1"代表有脉冲,"0"代表脉冲间隔。如果波形上每个点的信息用四位一组的代码表示,则称4比特,比特数越高,表达模拟信号就越精确,对音频信号信号还原能力越强。

你可能感兴趣的:(猫猫学编码)