1. 程式人生 > >字元、字符集、編碼——Something Every Programmer Should Know About

字元、字符集、編碼——Something Every Programmer Should Know About

看完《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還能去猜你的編碼= =