计算机 {字符集,字符编码,UTF/UCS,Latin-1,ASCII}
字符集
ASCII
字符集大小为: 2^7
;
[0, 2^7)
对应了若干个拉丁字母;
Latin-1
定义
又称ISO 8859-1
, 字符集大小为2^8
;
+: [0, 2^7)
: 对应ASCII (即兼容ASCII);
+: [2^7, 2^8)
: 对拉丁字母的补充 (所以我认为 他为什么叫做Latin-1
这是因为这补充的128
个字母 他们的最高位都是1
);
Unicode/UCS
定义
#Unicode#
Universe Code
万国码, 整个集合 分为17个子集(又称平面) 每个子集大小为16
字节, 因此整个集合大小为[U+0, U+110000)
;
+(第0平面): 称为基本多文种平面Basic Multiligual Plane (BMP)
, [0, 0xFFFF]
, 兼容Latin-1, 里面包含了所有语言的常用字符和常用符号, 汉字大多在[4e00, 9FFF]
(比如玫(73AB) 瑰(744B)
;
+(第[1,2,…,16]平面): 称为辅助平面, 基本很少用;
#UCS#
Universal Character Set
通用字符集, 也称ISO 10646
, 在编码方面 他和Unicode
是一致的 在很多语境下 他俩是一个东西, 但两者有一些细微差别 不必考虑;
性质
用U+?
来表示某个字符, 比如U+73AB
是玫, U+7370 = 瑰
;
编码
定义
性质
也称为页码Page code
, 比如UTF-8的页码是65001;
算法
常用编码格式
玫瑰:
UTF-8: E7,8E,AB,E7,91,B0
UTF-8 BOM: EF,BB,BF,E7,8E,AB,E7,91,B0
UTF-16 BE: FE,FF,73,AB,74,70
UTF-16 LE: FF,FE,AB,73,70,74
ANSI: C3,B5,B9,E5
GB18030: C3,B5,B9,E5
UTF
Unicode/UCS Transformation Format
;
UTF-8
[0, 7F]
(ASCII) -> [0...]
; 占据1字节, 可容纳2^7
个;
[80, 7FF]
-> [110..., 10...]
; 2字节, 可容纳2^11
个;
[800, D7FF] 和 [E000, FFFF]
-> [1110..., 10..., 10...]
; 3字节, 可容纳2^16
个;
依次类推…
对于一个U+x
, 先找到x
对应的多少字节, 比如他对应的2字节 那么 此时你只取x
的低11
位(保证高位一定没有1
) 依次放到[110..., 10...]
里面即可;
.
比如U+99
, 他属于[80, 7FF]
这类 所以占据2字节, 他的2进制为[10011001]
他不足11
位 前面补0
, 所以[000 10011001]
, 把他依次放到编码里, 即[11000010, 10011001]
这就是他的编码;
UTF-16(UCS-2)
性质
如果我们只涉及到第0平面, 那么使用UTF16 比用UTF8好;
基本多文种平面中的[U+D800, U+DFFF]
, 这些是不对应字符的, 而是供UTF-16使用来自定义映射的 (即UTF-16可以用这个区间 来映射辅助平面里的一些字符);
.
这一共是2^11=2048
个数, 是为了来表示辅助平面里的字符的; 辅助平面一共有2^20
个字符, 即他可以用(2^10)高位, (2^10)地位
组合成一个pair
来表示, 高位会对应基本平面里的[U+D800, U+DBFF]
, 低位会对应[U+DC00, U+DFFF]
, 即用2个基本平面里的编码(4字节) 来表示 辅助平面的字符;
. .
这里你可能认为, 不是需要2^10 * 2^10
个吗, 为什么是相加呢? 因为 只要再加1位 (即第11位) 这样 就多了2^10
种选择; 令...
表示10位, 那么0... 和 1...
他俩各自都有2^10
选择, 辅助平面里的任何字符 都会变成(0..., 1...)
的形式, 因此 低位/高位 会占据基本平面里的0/1 ...
即共11位;