咸阳做网站开发公司哪家好,珠海公司制作网站,怎样建房,怎么注册自媒体个人账号软件开发中乱码问题经常遇到#xff0c;Unicode#xff0c;UTF-8, ASCII等都是高频词语#xff0c;不过具体是啥意思其实都不清楚。这个周末研究了一下#xff0c;略有了解#xff0c;记录一下。
Unicode
Unicode本身是纯理论的东西#xff0c;和具体计算机实现无关。它…软件开发中乱码问题经常遇到UnicodeUTF-8, ASCII等都是高频词语不过具体是啥意思其实都不清楚。这个周末研究了一下略有了解记录一下。
Unicode
Unicode本身是纯理论的东西和具体计算机实现无关。它就是要给全世界的文字符号进行统一的编码。注意是所有的文字符号也就是除了正常的各国文字外还包括包括了各式各样的符号这样的话理论上符号的数量是无上限的虽然目前已经编码的符号还是有限的。
比如英文字母 比如汉字 比如象棋相关 任何一个文字符号都有一个自己的编码或者数字称为“代码点Code Point”, 表示方法为
UXXXX
例如字母A的代码点是U0041. 再次注意目前为止这都是还是纯理论和具体计算机无关。
按此所有的字符及其Unicode编码构成的集合就叫Unicode字符集Unicode Charactor Set, UCS。
早期的版本有UCS-2, 用两个字节BYTE)编码最多能表示65535个字符。每个代码点的长度是16位。
后来UCS-2不够用了因此出了UCS-4版本。UCS-4增加了两个字节采用4个字节编码最高位固定为0因此实际用31位。UCS-4在结构上有一个分层关系大致如下
第一层组Group)
用最高字节分成 128组最高字节的最高位固定为0所以最高字节有128个
第二层平面Plane)
对于每个组再用次高字节分为256个平面
第三层行Row) / 码位Cell)
对于每个平面根据第三个字节分为256行根据第四个字节分为256个码位。
总结如下图 UCS-4中还有一些规定比如BMP,PUA之类的概念这里就不作记录了。
以上都是纯理论的部分没有设计Unicode在计算机中的实现。需要注意的是Unicode的实现方式和编码方式不一定等价。一个 字符的Unicode编码是确定 的但在实际存储和传输过程中不同的系统平台设计可能是不一致的还有处于节省空间的目的 对Unicode编码的实现方式也可能不同。 UTF
Unicode编码的实现方式称为Unicode转换格式Unicode Transformation Format),简称UTF, 到这里UTF这次词出现了离日常接触的内容就比较近了。Unicode实现方式主要有UTF-8、UTF-16、UTF-32等分别以不同的字节数作为编码单位
UTF-8: 字节BYTE1个字节)
UTF-16: 字WORD2个字节)
UTF-16: 双字DWORD, 4个 字节)
看到BYTE/WORD/DWORD这些 词就能联想到一些具体的点了例如注册表中的值例如 C中的数据类型。 UTF-8
下面记录一下UTF-8的具体实现
UTF-8以字节为单位对Unicode进行编码这里的单位是指程序在解析二进制流时的最小单元在UTF-8中程序是以一个字节一个字节地解析文本。UTF-8具体实现如下 Unicde编码Hex所处范围 UTF-8字节流Binary 000000 ~ 00007F 0xxxxxxx 000080 ~ 0007FF 110xxxxx 10xxxxxx 000800 ~ 00FFFF 1110xxxx 10xxxxxx 10xxxxxx 010000 ~ 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
从表格可以看出UTF-8的特点是对不同范围的字符也就是Unicode码点使用不同长度的编码。
对于码点在0x00 ~ 0x7F的字符UTF-8与ASCII编码相同。UTF-8编码的最大长度是4个字节4字节模板有21个x, 也就是可以容纳21位二进制数。同时Unicode的最大码点0x10FFFF也只有21位。
举例中文字符 电怎样从Unicode实现为UTF-8?
查询得知电的Unicde码是0x7535 (在线 Unicode 编码转换 | 菜鸟工具)
0x7535落在000800 ~ 00FFFF这个范围 也就是表格 第三行使用三字节模板
1110xxxx 10xxxxxx 10xxxxxx
0x7535写成二进制是 0111010100110101, 根据模板分一下组就是
0111 010100 110101 填入模板
11100111 10010100 10110101写成十六进制就是
E7 94 B5用工具验证一下 正确。 好了Unicode与UTF-8的学习暂时告一段落。