2021-02-22
Win32
0
请注意,本文编写于 768 天前,最后修改于 327 天前,其中某些信息可能已经过时。

目录

1. 原始的ASCII编码

ASCII码表

2. ASCII编码的拓展:GB2312或GB2312-80

ASCII编码的拓展

3. UNICODE编码

为了解决ASCII码的不足

<1> 什么是UNICODE?

这是一个编码方案,说白了就是一张包含全世界所有文字的一个编码表,只要这个世界上存在的文字符号,统统给你一个唯一的编码:
Unicode编码范围是:0-0x10FFFF,可以容纳100多万个符号!

<2> UNICODE的问题:

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

4. 如何存储UNICODE:UTF-16/UTF-8 是Unicode的实现方式

<1> UTF-16:

UNICODE只解决了编码,不管怎么存储,而UTF-16/UTF-8才决定了在计算机中如何存储。
UTF-16编码以16位无符号整数为单位,注意是16位为一个单位,不表示一个字符就只有16位。这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节现在机器上的unicode编码一般指的就是UTF-16。

Unicode没有约定怎么存储,只有UTF-16 / UTF-8才约定了如何存储,如果存储时没有UTF-16 / UTF-8 只有Unicode那么默认使用UTF-16存储

c
UTF-16
假设
中: 0x12 34
国: 0x 00 01 23 34

所以 如果碰到一个特别的字符,两个字节放不下时,会占用四个字节,为什么是四个字节,而不是三个字节呢?
因为UTF-16默认一个存储单元是两个字节,一个存储单元存不下就要使用两个存储单元,也就是四个字节了

两个字节为一个单位

UTF-16的优点:
计算的时候,拆分时,解析时,非常简单,两个字节一个单位一刀一刀砍
UTF-16的弊端:
0-10FFFF,浪费存储空间,A一个字节就可以存储,UTF-16的话需要字节对齐,也就是2个字节,因此UTF-8出现

<2> UTF-8:

可变长存储方案
存储根据字符大小来分配,如A就分配一个字节,中就分配两个字节
优点:节省方案,方便解析位各种类型,根据文字编码范围

c
//编码范围
Unicode编码(16进制) 	║ UTF-8 字节流(二进制)
000000 - 00007F 	║ 0xxxxxxx
000080 - 0007FF 	║ 110xxxxx 10xxxxxx
000800 - 00FFFF 	║ 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 	║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

如中文的 中 字
E4 B8 AD
//因为1110xxxx 10xxxxxx 10xxxxxx是固定的,所以只需要提取x的部分
1110 (0100) 10(11 1000) 10(10 1101)
0100 1110 0010 1101
4    E    2    D

<3> BOM(Byte Order Mark):

即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型

c
UTF-8     	║ 	EF BB BF
UTF-16LE  	║ 	FF FE
UTF-16BE  	║ 	FE FF

示例,取自网络

本文作者:Na1r

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!