為什麼那麼多網站鍾情 UTF-8?


UTF-8 的幾個優勢

1. 亂碼不會擴散, GB2312 在丟失一位元組等情況下會造成後續所有文字變成亂碼
2. 不會產生錯誤的搜索結果, GB2312 在搜索的時候相鄰兩個中文會拼出一個新的字元,導致出現錯誤的搜索結果
3. 更大的字符集
4. 很多語言直接支持 UTF-8,部分語言存儲字元串到內存時直接使用 UTF-8編碼。
5. 與 GB2312/GB18030 相比, UTF-8是一個通用解決方案
6. Unicode 一直有人維護,而 GB18030 下一次更新不知道會是什麼時候了。

對於中文, UTF-8 和 GB2312 在 gzip 壓縮後都差不多,所以用來做網頁對帶寬影響很小

----
補充一下 @程序員 提到的寬位元組注入漏洞: 寬位元組注入_廣外網路安全小組 , 這個也是 GB2312/GB18030 編碼下的問題 (UTF-8 下沒問題)


UTF-8被大家選擇的主要原因有兩個:

  1. 兼容ASCII
  2. 前綴碼

前一個優點比較明顯也引人注意,但其實後一個優點更重要。前綴碼能讓程序員很方便地用遍歷的方法定位一段網路傳輸過來的字元串中出問題的範圍,保持能顯示部分最大化。這對那些工作在較差網路環境下時比兼容性重要得多。順便說一句:所有非前綴多位元組編碼在這種場合下最後的結果都是必須丟棄從出錯點開始到結尾的所有編碼,無論是GB碼還是Unicode/UTF-16。

我確實不知道那些指稱UTF-8是歧視說法究竟從何而來。但是UTF-8不是少數人的選擇,是幾乎全世界網路開發人員和幾乎整個Linux/BSD社區的選擇。要說歧視,ISO8859-*編碼區在UTF-8里統統變成兩個位元組,算不算他們自己歧視自己?我們的GB2312對ASCII是一個位元組,而所有的中文字元都是兩個位元組,算不算我們自己歧視自己?

這世界上不是只有「中國」和「西方」兩個國家。而且他們每天柴米油鹽的也很忙,沒時間專門找我們歧視。

[更新] 原作者似乎刪除了標題里的「歧視」說法,善莫大焉。
[更新] 原作者提出刪除了「歧視」說法的不是他。就他而言他堅持所謂「歧視」的立場,只好繼續討論。


為什麼使用UTF-8,這其中包含兩個問題:

  1. 為什麼使用Unicode
  2. 在眾多Unicode編碼中,為什麼使用UTF-8

第一個問題,最重要的回答是:國際化。Unicode是個不斷擴充的字符集,它中間包含了幾乎所有的語言需要的字元,因而在任意語言環境下相互交換都不會造成障礙。比如說我們在知乎,回答問題可以寫中文,可以寫日語,可以寫韓語,甚至阿拉伯文、泰文,甚至emoji,只有Unicode編碼才能讓我們在同一段文字中同時使用這些所有符號。像百度,以前用GBK,就會遇到繁體字發不了的問題,所以以前貼吧都會把繁體字轉成簡體字;更不要說更罕見的文字了。另外UTF-8編碼在各種操作系統和語言環境當中的支持也普遍比較好。UTF-8和其他Unicode編碼一樣,它到Unicode字元的映射是固定的,因此Unicode進行擴充之後,UTF-8也就自動進行了擴充。

第二個問題,其他人回答的已經不錯了,兼容ASCII、前綴碼等等,我再略微補充一點點:

  1. UTF-16、UTF-32都有大端小端的問題,只有UTF-8沒有。
  2. UTF-8跟ANSI字元串一樣,不會在字元串當中出現,兼容了C程序以作為字元串結束的傳統。
  3. 對Web網頁、Javascript、CSS等文本內容來說,大部分仍然以使用ASCII字元為主,因此用UTF-8編碼大小相對比較小。
  4. 對於Web來說,如果伺服器返回的Content-Type當中沒有包含編碼,瀏覽器可以使用&標籤里的http-equiv,或者charset來判斷編碼。但是通常這個過程是首先使用默認代碼頁對網頁文本進行解析的。UTF-8是Unicode編碼當中唯一兼容ASCII的,這樣只要你的&之前沒有ASCII以外的字元,不管瀏覽器的默認代碼頁是什麼,都可以正確解析出你的&標籤。

UTF-8並不是沒有缺點,比如說一個比較明顯的缺點是要正確計算字元串長度的時候仍然需要使用多字元編碼的演算法,在這一點上來說UTF-32就比較方便;但比起優點來說還是優點更加明顯,尤其是作為傳輸編碼的時候。


UTF8是一種編碼,統一的編碼方便交流。用UTF8的網站不管你的系統默認用哪個regioncode,都不會出問題。這個根本不存在誰歧視誰。


今天心情不太好,吐槽一下lz (也就是熊偉)的回答

1, unicode是字符集,utf-8是一種編碼形式,請google一下相關資料再來發言。
2,英文26個字母,漢字有好幾萬個
3,除非你重寫ascii碼錶,然後在寄存器級別把漢字們存下來。
4,參見1,請再次好好研究一下到底他們是什麼關係。
5,選用gbk還是utf-8和編程水平確實無關,只和智商直接相關,給自己找麻煩不是傻嘛。
6,你問這些門戶網站的人如果能0成本轉utf-8, 會有人不轉嗎?
7,我特別討厭這些好高騖遠的說法,還不會走就想跑,還做不出什麼像樣的產品就號稱要制定標準,這才是中國難以發展的原因。
8,標準不代表先進,更不代表正確。
9,我想這不是歧視,只是無知而已。


UTF-8是最方便的unicode編碼方式,因為它兼容ASCII。雖然我們進入Python時代了,相信我,你還是會時不時遇上遠古的處理ASCII的代碼的,而這些代碼99%的情況下不用重寫就能在現代系統上處理國際化文字。前提是你的系統用UTF-8。

UTF-32是另一種方便的編碼,因為它定長。

UTF-16是個兩頭不靠的方式。要兼容沒兼容,又是變長碼。當初設計它的時候以為16位就夠了,純屬前瞻不足的產物。可惜Windows拿它來做API的介面。


UTF-8 遍地開花


不考慮流量帶寬字元佔用大小問題.UTF8自然是首選.因為對於開發人員來說並不會產生亂碼

並且現在很多網站非同步功能做的風風火火.而JSON的傳輸不管使用何種編碼都統一以UTF8的形式傳輸.
所以哪怕是其它形式的編碼.在需要傳輸JSON形式數據時.也要轉換成UTF8編碼.所以這不是多此一舉嗎?

至於是多佔用流量問題還是代碼控制轉換編碼的選擇問題上.就不多說了.

大網站伺服器帶寬基本上都不在考慮之列.由此產生


少扯意識形態,少扯國家權益。

老外本來ASCII就夠用的陪你把網站做成Unicode誰吃的虧多。

互聯網是全球的,亂碼這種現象本來就是時代垃圾,早晚要統一。

我見過一個寫Java的神經病因為老外的庫不支持中文,竟然說出:這些老外就是他媽的歧視中國人。


我以為題主想問為什麼是UTF-8而不是UTF-16,看了一圈答案才發現題主想問為何不是GB……GB……


我覺得如果問「為什麼那麼多網站鍾情於GB2312/GB18030?」,那還值得一說。
btw:我承認,讓BBS支持utf-8,確實有點太麻煩了,所以至今還是不支持


採用UTF8是因為你可以在網頁上顯示任何語言。另外一個好處不是對用戶的,而是對開發人員,採用UTF8就幫你省了調亂碼的時間。

如果你認為utf8帶歧視的話,可以用unicode,這樣英文和中文都使用相同位元組數,就沒有歧視一說了,但是網頁流量會增加50-80%。


如果用 GB 系列的字符集就用不了 Emoji 了啊!


我期待有一天會有個壟斷形的公司站出來大喊一聲:干他娘的,你們這些開發商全TM統一給我用UTF-8不然就等著倒閉吧.

——來自於一個經常對項目經理說沒問題今天下班前就能搞定然後卻因為一個莫名其妙的亂碼問題浪費一整天然後無法按時交差的Java程序員


兼容性和容錯性:現高票那位解釋了,也不想班門弄斧。
標準:是世界業界推薦標準(好像一個是IEEE,另一個是郵件標準,外出中到時再補充),支持的話有更好的適應性,甚至減少一些無厘頭的問題。(utf-8的wp條目: 互聯網工程工作小組(IETF)要求所有互聯網協議都必須支持UTF-8編碼。[1] 互聯網郵件聯盟(IMC)建議所有電子郵件軟體都支持UTF-8編碼。)
實際上,如果想解決i18n和面向可能的多語言輸入的亂碼問題的話,utf-8比gb系列更方便。至於大公司不換,更多的是歷史問題而不是真的好用。


謝邀……
簡單從一線開發人員來說,選擇utf-8的最重要的原因:亂碼問題
1、頁面中文亂碼問題。保證從資料庫到前端頁面都採用統一的編碼能夠避免出現中文亂碼的問題,簡單方便有效。
2、ajax傳遞數據默認採用utf-8編碼,如果你的頁面採用的是非utf-8,那在處理中文字元的時候需要進行二次轉碼或者重新定義header等方式。為了不給前端同學造成不必要的工作量,盡量採用統一的utf-8編碼。
3、如果和其他公司進行合作,一般公司提供的API或者數據也都是utf-8編碼的,這也是必須要考慮的一個方面。


因為你不是做網站的,我早年做網站時,08年以前,我用的就是GB碼,當時的各種亂碼問題快把我煩死了,特別是非同步載入方面,當然當時我比較菜也是一個原因。不過後來換成了UTF-8,世界就清凈了。


https://zhuanlan.zhihu.com/p/26261762


編碼由來

編碼的成長見證了計算機由個體到集體 由國家到世界

一、最初的編碼

計算機最初的編碼的概念,最初計算機大家都拿著0101

二、以下是位元組的由來

」所謂位元組,原意就是用來表示一個完整的字元的。最初的計算機性能和存儲容量都比較差,所以普遍採用4位BCD編碼(這個編碼出現比計算機還早,最早是用在打孔卡上的)。BCD編碼表示數字還可以,但表示字母或符號就很不好用,需要用多個編碼來表示。後來又演變出6位的BCD編碼(BCDIC),以及至今仍在廣泛使用的7位ASCII編碼。不過最終決定位元組大小的,是大名鼎鼎的System/360。當時IBM為System/360設計了一套8位EBCDIC編碼,涵蓋了數字、大小寫字母和大部分常用符號,同時又兼容廣泛用於打孔卡的6位BCDIC編碼。System/360很成功,也奠定了字元存儲單位採用8位長度的基礎,(這裡的字元就是位元組 最初一個字元就是用8個位元組來表示)這就是1位元組=8位的由來。「 from:http://www.guokr.com/question/542532/

三、ANSI(ascll)的由來 (美帝編碼)

八位的位元組一共可以組合出256(2的8次方)種不同的狀態。他們把其中的編號從0開始的32種狀態分別規定了特殊的用途,一但終端、印表機遇上約定好的這些位元組被傳過來時,就要做一些約定的動作。遇上00x10, 終端就換行,遇上0x07, 終端就向人們嘟嘟叫,例好遇上0x1b, 印表機就列印反白的字,或者終端就用彩色顯示字母。他們看到這樣很好,於是就把這些0x20以下的位元組狀態稱為「控制碼」。 他們又把所有的空格、標點符號、數字、大小寫字母分別用連續的位元組狀態表示,一直編到了第127號,這樣計算機就可以用不同位元組來存儲英語的文字了。大家看到這樣,都感覺很好,於是大家都把這個方案叫做 ANSI 的 「Ascii」 編碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。當時世界上所有的計算機都用同樣的ASCII方案來保存英文文字。
後來,就像建造巴比倫塔一樣,世界各地的都開始使用計算機,但是很多國家用的不是英文,他們的字母里有許多是ASCII里沒有的,為了可以在計算機保存他們的文字,他們決定採用127號之後的空位來表示這些新的字母、符號,還加入了很多畫表格時需要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最後一個狀態255。從128到255這一頁的字符集被稱「擴展字符集」。從此之後,貪婪的人類再沒有新的狀態可以用了,美帝國主義可能沒有想到還有第三世界國家的人們也希望可以用到計算機吧!
四、 中國人的編碼

GB2312

等中國人們得到計算機時,已經沒有可以利用的位元組狀態來表示漢字,況且有6000多個常用漢字需要保存呢。但是這難不倒智慧的中國人民,我們不客氣地把那些127號之後的奇異符號們直接取消掉, 規定:一個小於127的字元的意義與原來相同,但兩個大於127的字元連在一起時,就表示一個漢字,前面的一個位元組(他稱之為高位元組)從0xA1用到0xF7,後面一個位元組(低位元組)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼里,我們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是常說的 「全形」 字元,而原來在127號以下的那些就叫 「半形」 字元了。

中國人民看到這樣很不錯,於是就把這種漢字方案叫做「GB2312」。GB2312 是對 ASCII 的中文擴展。
但是中國的漢字太多了,我們很快就就發現有許多人的人名沒有辦法在這裡打出來,特別是某些很會麻煩別人的國家領導人。於是我們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。

GBK

後來還是不夠用,於是乾脆不再要求低位元組一定是127號之後的內碼,只要第一個位元組是大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴展字符集里的內容。結果擴展之後的編碼方案被稱為 GBK 標準,GBK 包括了 GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。 後來少數民族也要用電腦了,於是我們再擴展,又加了幾千個新的少數民族的字,GBK 擴成了 GB18030。從此之後,中華民族的文化就可以在計算機時代中傳承了。
中國的程序員們看到這一系列漢字編碼的標準是好的,於是通稱他們叫做 「DBCS」(Double Byte Charecter Set 雙位元組字符集)。在DBCS系列標準里,最大的特點是兩位元組長的漢字字元和一位元組長的英文字元並存於同一套編碼方案里,因此他們寫的程序為了支持中文處理,必須要注意字串里的每一個位元組的值,如果這個值是大於127的,那麼就認為一個雙位元組字符集里的字元出現了。那時候凡是受過加持,會編程的計算機僧侶們都要每天念下面這個咒語數百遍:
「一個漢字算兩個英文字元!一個漢字算兩個英文字元……」

五、世界人民的編碼

因為當時各個國家都像中國這樣搞出一套自己的編碼標準,結果互相之間誰也不懂誰的編碼。

一個叫 ISO (國際標誰化組織)的國際組織決定著手解決這個問題。他們採用的方法很簡單:廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼!他們打算叫它 「Universal Multiple-Octet Coded Character Set」,簡稱 UCS, 俗稱 「unicode」。unicode各版本說明請參考http://www.cnblogs.com/wpcockroach/p/3907324.html

參考:http://blog.chinaunix.net/uid-20446794-id-1677389.html


原文:http://docdev.cn


一句話:
一個頁面可以同時顯示所有國家文字,且沒有亂碼,沒有沖碼問題…


推薦閱讀:

社會化媒體營銷如何落地,成為銷量?
美團網為什麼收購猛買網?
雅虎近期的大舉收購是否重塑了公司的核心文化?下一步會如何在現有基礎上整合收購的資產?
最頂尖的程序員年薪有多高?
為什麼說房地產與互聯網的結合是大趨勢?

TAG:互聯網 | Unicode(統一碼) | 字元編碼 | UTF-8 |