猫猫学编码
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个字节来表示,并且限制了最高位必须为0,所以只能表示2^7=128个不同字符。例如:
- 大写字符A 在ASCII中用 0100 0001(二进制,最高位为0)表示,A在ASCII中的码位就是0100 0001, 10进制为65,16进制为0x41
- 范围就是 0000 0000 -> 0111 1111 共128
-
分为可见字符和控制字符:
- 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 : "\\u732B"
unicodeScalars 是字符集的具体码位,可以用系统的科学计算器看一下:
那utf8的数怎么来的呢?
- 猫:u732b的码位是这样的:
- 111 0011 0010 1011
- 根据上面的表,我们找到与对应的规则为第三排的:
- 1110xxxx 10xxxxxx 10xxxxxx
- 将1的二进制码插入到2的x空位中得出:
- 1110 0111 1000 1100 1010 1011
- 将3换算为10进制:
- 231 140 171
- 宗上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
单位换算
单位 | 单位备注 | 低位兑换 | 低位备注 |
---|---|---|---|
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位数据
- 计算机专业术语,是信息量单位,是由英文BIT音译而来。二进制数的一位所包含的信息就是一比特,如二进制数0101就是4比特。
- 二进制数字中的位,信息量的度量单位,为信息量的最小单位。数字化音响中用电脉冲表达音频信号,"1"代表有脉冲,"0"代表脉冲间隔。如果波形上每个点的信息用四位一组的代码表示,则称4比特,比特数越高,表达模拟信号就越精确,对音频信号信号还原能力越强。
以上是关于猫猫学编码的主要内容,如果未能解决你的问题,请参考以下文章