字符、字符集、编码——Something Every Programmer Should Know About

来源:互联网 发布:网络协议的作用 编辑:程序博客网 时间:2024/06/06 03:16

看完《Joel on software》上的《The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)》之后,觉得对UTF-8、Unicode、ASCII之类的字眼的有种茅塞顿开的感觉,在用Python2时碰到的种种字符串问题总算是有了个答案,也明白了为什么现在是UTF-8的世界。下面是我阅读过程中做的一些笔记,希望对你有用!


字符、字符集、编码:
  1. (此时是英语的世界,所谓的字符集指所有英文字母以及一些其他符号)
  2. ASCII编码——使用7个bit
  3. 一个byte有8个bit,还有一个bit没被ASCII使用
  4. OEM编码——包含很多个字符集,free-for-all,大家用各种不同的方式使用第8个bit;不同的方式加在一起叫做ANSI字符集,每种不同的使用方式叫做code page
  5. (此时加入了一些亚洲字母,字符集在上面字符集基础上扩充)
  6. 很多亚洲字母,8个bit放不完,于是有了DBCS编码(double byte character set)
  7. 互联网出现,上面那一堆开始崩溃,于是Unicode字符集出现
    1. Unicode是为了建立一个单一的字符集,它可以囊括这个星球上所有的书写系统
    2. 在Unicode字符集中,一个字符被表示为一个code point(U+XXXX),里面的字母8进制
  8. 字符集怎么存进内存或者表示在email里面呢?需要编码
    1. 最早是全部2个bytes(UTF-16编码、UCS-2编码),但是如U+0048,是存储为high-endian还是low-endian呢(会影响CPU运算速度),不同机器不同的偏好,所以出现了BOM(Unicode Byte Order Mark,利用文档开头的FF、FE判断是high-endian还是low-endian)
    2. 问题是,只用英语的人开始抱怨要用比以前更多的空间,而且以前用ANSI和DBCS编码的文档也没人转换他们
    3. 于是UTF-8编码出现了,0-127仍然是一个byte,其他依次增加byte,从2-6不等——UTF-8英语文本和用ASCII的一模一样
    4. 还有其他的一些编码方式,如UTF-7编码、UTF-32(UCS-4)编码
    5. 编码问题自此全部解决!
  9. 最重要的!世界观可以改变了,现在是Unicode字符集的世界观——你可以将所有letter看做是code point。你可以对这些code point进行旧式编码方式进行编码,例如ASCII等,但是会有错,会有问号、方格;或者用新式编码进行编码,例如UTF-7、8、16、32都可以
  10. 至于这么个囊括所有东西的字符集Unicode是怎么得来的,反正有人冒着各种风险,各种政治因素,把它捣弄出来了!
  11. 给你一个字符串但是不给你编码方式,是没用的!
    1. 0-127的还好,128以上的只能呵呵。
    2. HTML的Content-Type
    3. IE还能去猜你的编码= =

0 0
原创粉丝点击