天天看點

從ASCII聊起

在網際網路的世界,端與端之間傳遞的封包都是未經過編碼的位元組流,每8位組成1個位元組,計算機以二進制為基礎,這是由于使用半導體的開合狀态表示1和0,這樣8個電半導體就可以組成一個位元組,這正是應用層使用的最小機關——位元組。

在通過Socket進行網絡通信的程式中,假如我們在接收到封包時不知道通過什麼編碼才能正确解碼,最好的辦法就是用Socket讀取位元組流,在确認編碼後再對這些位元組流進行轉碼,否則産生解碼錯誤。我們常見的編碼有ASCII、GB2312、UNICODE、UTF-8等等,除此之外還有很多其他編碼,為什麼會有這麼多不同的編碼?

ASCII編碼即American Standard Code for Information Interchange,作為美國标準資訊交換編碼,并且計算機剛開始隻在美國流行,是以當時所有的計算機都使用ASCII編碼,ASCII編碼是由8比特組成,從0到127分别用于表示不同的字元,包括各種符号、英語字母、阿拉伯數字等,由于128種字元隻需7位即可完成編碼,是以最高位被0填充。這128個字元已經完全滿足使用英語的美國人,英語單詞可以通過拆分成字母後用ASCII碼表示。

後來随着計算機的迅速發展,其他國家相繼引入計算機,他們發現這些編碼根本不夠對他們本國文字編碼,ASCII碼一共8位,最多也隻能表示256個字元,于是他們對最高位做文章,其中0-127已經被美國使用并成為标準,為了相容考慮肯定不能改動,剩下128-255可供使用,但很快剩下的128個編碼又被用完,現在唯一能做的就是使用兩個甚至更多個位元組來表示一個字元,每個國家都有自己的規定,于是中國編制了GB2312編碼,為了相容ASCII,它規定一個位元組如果小于等于127則表示ASCII,如果兩個大于127的位元組連在一起則表示漢字,而且兩個位元組的值都在一定的範圍内。經過一輪擴充後已經基本解決漢字編碼不足問題。

再後來很多國家都按自己規定給自己的文字編碼,對其他國家的編碼一概不認識,情況一度混亂。接着國際标準化組織推出UNICODE編碼,它要把全世界所有文字元号都包括進來,使用兩個位元組16位對所有字元進行編碼,同時為了保證相容ASCII碼,低七位仍用于表示ASCII碼原來的字元。通過UNICODE确實是把世界所有字元都統一起來了。

UNICODE編碼雖然統一了所有字元,但還存在一個問題,如果是英文字元其實用一個位元組已經足夠,但使用UNICODE卻必須要搭上另外一個毫無意義的位元組,在網絡傳輸過程中則意味着要多傳輸一倍無用的封包。于是引入UTF-8編碼,它屬于UNICODE的一種實作,它是一種變長的編碼方式,在UTF-8規定的實作下可以用一個位元組表示ASCII碼表示的所有字元,避免了多餘的空間浪費。

除了上面幾種常見的編碼,還有很多其他編碼,不同編碼指定的規則也不同,但基本都對ASCII做了相容處理,可以說ASCII是最基礎的。

========廣告時間========

<a href="http://blog.csdn.net/wangyangzhizhou/article/details/74080321">為什麼寫《Tomcat核心設計剖析》</a>

=========================

歡迎關注:

從ASCII聊起