猫猫学编码

Posted 翟乃玉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猫猫学编码相关的知识,希望对你有一定的参考价值。

编码

在上一篇文章中,我遇到了关于swift中的emoj字符串的utf16.cout才能等于NSString.cout的神奇问题。处于对utf8的好奇以及编码知识的了解,我决定好好了解下编码这一个学问。

Swift5中String.count 与 NSString.length不相等:https://znycat.blog.csdn.net/article/details/114264328

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 1Byte 2Byte 3Byte 4Byte 5Byte 6
7U+0000U+007F10xxxxxxx
11U+0080U+07FF2110xxxxx10xxxxxx
16U+0800U+FFFF31110xxxx10xxxxxx10xxxxxx
21U+10000U+1FFFFF411110xxx10xxxxxx10xxxxxx10xxxxxx
26U+200000U+3FFFFFF5111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
31U+4000000U+7FFFFFFF61111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx

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

"猫".utf8
▿ UTF8View("猫")
  - 0 : 231
  - 1 : 140
  - 2 : 171
"猫".unicodeScalars
▿ StringUnicodeScalarView("猫")
  - 0 : "\\u732B"

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

那utf8的数怎么来的呢?

  1. 猫:u732b的码位是这样的:
    • 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的这些字符集。

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

PS

字节Byte

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

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

单位换算

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

比特

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

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

以上是关于猫猫学编码的主要内容,如果未能解决你的问题,请参考以下文章

猫猫学编码

猫猫学Swift之变量和常量

猫猫学swift之基础

猫猫学swift之基础

猫猫学iOS之UITextField全解

猫猫学iOS之UITextField右边设置图片,以及UITextField全解