编码-Unicode、CodePage、ASCII和其它

Joel Sposkley的这篇文章,https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/ , 谈了字符和编码,如果你对unicode、code page、ASCII这些不是很明白,值得一读。

我在这里做点记录:code point就是字符对应的数字,属于定义的范畴;encoding就是怎么表示数字的问题,属于表示的范畴。一个code point,如122,可以有多个表示,可以用ASCII,可以用UTF-7,还可以是UTF-8或者UTF-16,还可以是你自己的编码规则。


提一个问题:那我们说ASCII码的时候究竟是encoding还是code point呢?是encoding,对应的code point是0至127的数字。用7位就够了,计算机的byte大部分是8bits的,有一位浪费了,所以大家都想把高128个code point利用起来,因为语言的不同,各国对高128位的定义是不同的,结果就是各种不同的code page,不同的Code Page,表明高128字符不一样。


关于UNICODE。Unicode只有唯一的code point表,需要注意的是UCS-2和UTF-16不同的。UCS-2最多表示65536个字符,不够;UTF-16和UTF-8一样长度是可变的,一个16 bits不够的时候就用两个,是用来补漏的。目前UNICODE只涉及到17个板块,每块最多65536个字符。UTF-16完全可以表示。Windows最早只支持UCS-2,后来在Windows 2000中完全支持UTF-16。

最后重提一下原文中最重要的一点:There Ain’t No Such Thing As Plain Text.(光给一串字节不给编码都是耍流氓


参考:

https://en.wikipedia.org/wiki/Unicode

https://en.wikipedia.org/wiki/UTF-16

https://en.wikipedia.org/wiki/Unicode_in_Microsoft_Windows


展开阅读全文

没有更多推荐了,返回首页