為什麼編碼(GBK、Big-5 等)問題這種歷史遺留始終得不到解決?


這個問題,歸根結底還是兼容性問題,其實微軟有一定責任。

在這個世界上,所有不向後兼容的修改,都會受到很多人的抵制,除非世界上根本沒有更好的替代品。

Intel 的 IA64 架構是個最典型的例子,搞了一個不兼容 32 位的指令集,然後無人問津,最後讓 AMD 用 amd64 指令集搶先,最後 intel 只好乖乖的仿造 amd64 重新做了個 em64t 指令集。

類似的,打破向後兼容造成的失敗,還有很多。

Unicode 是超大字符集的編碼,所以它在誕生之初就註定了無法使用單位元組直接表示,為了表示Unicode,誕生了多種傳輸編碼,例如 utf-8, utf-16, utf-32, 以及直接用原始編碼表示方式的 ucs-2, ucs-4 等等。

我們知道,在 Unicode 誕生之前,單位元組 ascii 是使用得非常廣泛的,latin1 兼容 ascii 的基礎部分,gb 也兼容 ascii 的基礎部分,big5 也同樣兼容 ascii 的基礎部分。他們雖然互相不兼容,但對 ascii 全是兼容的。

在 Unicode 的各種表示方式中,有沒有一種與 ascii 兼容?有,那就是 utf-8,這是 POSIX 系統(Linux,以及各種 Unix)的選擇。因為兼容,這種選擇得到了廣泛的接受,所以在 Linux 中,utf-8 成為一統天下的編碼集。而且 C 程序員仍然可以妥妥的使用 char * 作為字元串無壓力啊啊啊。所以在 Linux 中基本上不會見到有人使用 GB/big5/latin1 之類的編碼,簡單的說,utf-8 終結了一切。

但是到了 Windows ,這區別就大了。微軟開始做 unicode 的時候,就直接採用了 ucs-2 或者 utf-16,因為 ucs-2 跟 utf-16 在絕大部分編碼中是相同的,我從肉眼無法分辨微軟具體用的是哪種,不過無論是哪一種,都與 ascii 不兼容(簡單的說,就是與 ansi 不兼容)。所以這裡問題就來了,C/C++ 的程序員們誰願意修改字元串的表示方式啊?——願意改的人不多,除了 Java 等語言的天生就強制使用 Unicode 字元串的以外,但那也不存在改,而是天生就這樣。——當然字元串直接是 Unicode 會造成其他的問題,用過的人都懂的。

utf-8 其實能解決很多兼容性方面的問題,遺憾的是 utf-8 本身是變長的,在計算字元串起止,以及計算字元串長度方面會存在一些不便。ucs2 跟 ucs4 能解決變長的相關問題,但會帶來很多不兼容問題,特別是會帶來 BOM 本身的兼容問題,總需要修改的代碼量會很大。

所以說 Unicode 的各種表示方式,都不完美,都不如原始的 ascii/ansi 更方便,而且微軟主推的那種方式還存在兼容性問題,需要開發者完全修改字元串的使用方式,這受到了很大的抵觸,可能是 Unicode 沒有完全普及的原因。——我天真的想,如果微軟當初選擇的是 utf-8 而不是 ucs2,如果微軟選擇了一種不需要 BOM 的編碼方式,那麼現狀有可能會好很多很多。

當然,最終,歸根結底,我覺得政治因素也不可忽略。因為 Unicode 並不是國家標準,GB 才是。


主要原因是,win9x 不支持 Unicode,而 PC 軟體第一次大爆發是在 9x 內核的系統上。


這個問題微軟要負首要責任。

諸位看看自己的記事本,在保存文件時默認的編碼選項是什麼?ANSI?為什麼不是 UTF-8?

再看看自己的 Visual Studio,默認的編碼是什麼?GBK 編碼吧?為什麼不是 UTF-8?

嗯。再看看人家 Notepad++,直接默認 UTF-8。要切換編碼,可以,那是一個非常不直觀的過程,也就是你要明確表示自己有換編碼的需求人家才給你換。

現在這個時代,你想玩點台灣的、日本的 PC 遊戲,不會點修改編碼的技術你還玩不了。


完全是開發軟體的人不選擇unicode嘛,沒什麼理由的。windows從2000開始的unicode就支持的已經夠用了,xp基本上該支持的都支持了,VS都把默認改成了unicode,他們還是喜歡在windows上用char*,有什麼辦法。


手持一根錕斤拷,大吼三聲燙燙燙,要想從此過,命財都拿來!
==============
說白了就是一開始沒想清楚,有點積重難返了


unicode更佔地方……當然我相信真的是開發沒有動力改

比如招商銀行客戶端就不是unicode
在公司里的英語系統上就亂碼

每次想要用還要改windows那個指定的內碼,重啟電腦,再啟動


有部分台灣人吐槽其他字符集都包含了噁心的『簡化字』,所以一直堅持使用只含『正體字』的big5字符集。而大陸人也有類似的想法,覺得繁體字什麼的滾粗,gb2312 6700+簡體字就夠用了。


unicode既包含了殘體又包含了煩體,還有一堆垃圾字,所以台灣人和大陸人都看不下去了使用原先的雖然字數少但是個個是精品的字符集。另外還有unicode為了加這一大堆殘體煩體佔用碼長,導致(為了解決西方人ascii兼容性問題而提出的)utf-8裡面,漢字基本區有3位元組,集外是4位元組;如果純粹不考慮utf-8,用utf-16給漢字用,說不定能縮減你的文件大小哦!


歷史遺留問題指的是什麼?現在各個編碼之間沒有什麼不方便啊。如果說的是unicode行業標準為什麼沒有取代GB,BIG5等國家標準,原因無非幾點

- 歷史原因,unicode出現的晚,而且廠家推廣比較弱,就MS在主推,而且還是近幾年的事
- unicode有其局限性,從數據結構到演算法都變了(雙位元組了嘛),和老設備存在兼容性。從這個角度我個人比較推崇utf8。同樣是strcopy可以適用於utf8,ascii,GB,big5等。這條很重要,畢竟你寫的程序直接或間接是要上網的,是要通過網路傳輸的。

所以unicode並不是文字編碼的未來,utf8才是。


嵌入式領域還是有些地方想省空間的,另外就是國標裡面有些地方就是規定要使用GBK編碼,除非改國標,但是又賣出了很多設備,同時設備之間的通訊怎麼辦,於是,就不改了吧。


gbk 優秀(表現能力基本可以表現 所有常用文字)
存儲優秀 英文一個位元組中文兩個位元組。
Unicode是沒法比的


推薦閱讀:

如何用 Potplayer 消除 .srt 文件的中文字幕亂碼?
如何評價 iOS 8.3 中各種膚色的 Emoji 表情?

TAG:MicrosoftWindows | Unicode統一碼 |