字元、字符集、編碼——Something Every Programmer Should Know About
阿新 • • 發佈:2019-01-25
看完《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的世界。下面是我閱讀過程中做的一些筆記,希望對你有用!
字元、字符集、編碼:- (此時是英語的世界,所謂的字符集指所有英文字母以及一些其他符號)
- ASCII編碼——使用7個bit
- 一個byte有8個bit,還有一個bit沒被ASCII使用
- OEM編碼——包含很多個字符集,free-for-all,大家用各種不同的方式使用第8個bit;不同的方式加在一起叫做ANSI字符集,每種不同的使用方式叫做code page
- (此時加入了一些亞洲字母,字符集在上面字符集基礎上擴充)
- 很多亞洲字母,8個bit放不完,於是有了DBCS編碼(double byte character set)
- 網際網路出現,上面那一堆開始崩潰,於是Unicode字符集出現
- Unicode是為了建立一個單一的字符集,它可以囊括這個星球上所有的書寫系統
- 在Unicode字符集中,一個字元被表示為一個code point(U+XXXX),裡面的字母8進位制
- 字符集怎麼存進記憶體或者表示在email裡面呢?需要編碼
- 最早是全部2個bytes(UTF-16編碼、UCS-2編碼),但是如U+0048,是儲存為high-endian還是low-endian呢(會影響CPU運算速度),不同機器不同的偏好,所以出現了BOM(Unicode Byte Order Mark,利用文件開頭的FF、FE判斷是high-endian還是low-endian)
- 問題是,只用英語的人開始抱怨要用比以前更多的空間,而且以前用ANSI和DBCS編碼的文件也沒人轉換他們
- 於是UTF-8編碼出現了,0-127仍然是一個byte,其他依次增加byte,從2-6不等——UTF-8英語文字和用ASCII的一模一樣
- 還有其他的一些編碼方式,如UTF-7編碼、UTF-32(UCS-4)編碼
- 編碼問題自此全部解決!
- 最重要的!世界觀可以改變了,現在是Unicode字符集的世界觀——你可以將所有letter看做是code point。你可以對這些code point進行舊式編碼方式進行編碼,例如ASCII等,但是會有錯,會有問號、方格;或者用新式編碼進行編碼,例如UTF-7、8、16、32都可以
- 至於這麼個囊括所有東西的字符集Unicode是怎麼得來的,反正有人冒著各種風險,各種政治因素,把它搗弄出來了!
- 給你一個字串但是不給你編碼方式,是沒用的!
- 0-127的還好,128以上的只能呵呵。
- HTML的Content-Type
- IE還能去猜你的編碼= =