乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      編碼歪傳

       看見就非常 2015-04-24

      子曰:亂碼是一種思念,而思念是一種病。相信很多Web人常常糾結于亂碼當中,可能是展現、可能是表單提交、可能是數據庫、可能是接口、可能是抓取……反正任何一個涉及到輸入或者輸出字符的地方都有可能被你碰到過亂碼。

      為了解釋和解決亂碼問題,并且明確一些常見的誤區(qū),我打算寫這樣一個系列,介紹一些字符編碼相關的東西,目前規(guī)劃了3篇。

      基本上內容會比較偏科普性質,希望大神們輕拍,因為我相信這些將會是非常重要的基礎知識,如果你能完整的讀下去,肯定會在你以后遇到亂碼的時候幫助到你的思考方式,快速找到原因。

      字符

      我們的語言基本上都圍繞著字符,就是character,常簡稱char,很多時候字符會是文本的最小組成單位(注意只是“很多時候”,因為世界是奇妙的)。

      不是一定要文字才叫字符,一些注音字符、數學符號、某些文字里的修飾符號、特殊符號、表格符號、甚至Emoji等等,其實都是字符。

      字符集

      字符要成套才有用,比如“英文字母”就是一個字符集,當然這么說聽起來對計算機毫無意義。

      一般我們所說的字符集(Character Set)就是一個規(guī)范,它收錄若干字符,并且給這些字符逐一分配了一個編號當作索引(為了不過早引入編碼的概念造成混淆,這里我稱其為“編號”)。

      ASCII

      ASCII是當今計算機世界最經典的字符集,它收錄了英文字母和若干標點,還有一些專門供計算機使用(不是給人看)的控制字符。

      GB系列

      GB2312是一個常見的中文字符集,其中“GB”就是“國標”(咱們國家很多不同行業(yè)的標準代號都是這樣命名的)。它收錄了大概幾千個漢字,以及幾百個西文字符。

      GBK是微軟最早在Win95里實現的對GB2312進行的擴展,追加了很多繁體字和西文字符,總計收錄的字符數大概有20000多個。K就是拼音“擴展”。

      GB18030是國標對GB2312的升級(當然中間還有其他升級,但大多被淹沒在歷史潮流里面了),它一下就收錄了70000多個字符,最大的升級部分有繁體中文字符、新字、生僻字、少數民族文字、日韓字符等。

      上面三個GB系列的字符集都是為中文設計的,當然也擴充了一些東亞語文的內容(CJK字符,Chinese, Japanese, Korean),因為這些鄰居的字符在中國也挺常出現的。

      Big5

      又稱大五碼,是繁體中文地區(qū),例如灣灣、港港、澳澳常用的字符集,大概收錄了一萬多個字符,其中以繁體中文為主。因為被Windows所接受成為繁中版的默認編碼而成為了事實標準。

      UCS

      就像中文一樣,幾乎每種語言都存在一個給自己的語言設計字符集的問題。

      ISO意識到這個問題之后,設計了一套通用字符集UCS(Universal Character Set),目的是用一套字符集表示全世界(甚至外星人?。浚┑乃凶址?!

      結果UCS成功了,因為互聯網發(fā)展的太快了,任何國家的人每天都在互聯網上瀏覽來自全世界的不同語言不同文字的內容,大家當然希望用一套字符集就能收錄全世界所有的字符。

      字符編碼

      很多人會把字符集字符編碼的概念搞混,其實不怪,因為這倆東西好多時候都是捆綁定義的。

      字符編碼(Character Encoding)就是按照一定的技術要求(比如以8bit為單位)對字符集中的每一個字符進行編碼,以便文本能夠在計算機和網絡傳輸上使用。

      簡單的說,就是把字符集里面的那個每個字符的編號,給弄成計算機能懂的格式。

      很多字符集在制定的時候,就已經配套了它的編碼方案,比如ASCII、GB系列、Big5。對于這種字符集/編碼,稱呼上雖然模糊,但結合技術語境而言一般也不會有什么誤解。

      ASCII

      標準ASCII只收錄了128個字符,使用7bit可以完美編碼。例如英文字母A的ASCII編碼就是十六進制0x41,然后1字節(jié)剩下的一位就沒啥用了,可以用來當奇偶校驗。

      后來ASCII被擴展到了8bit,供256個字符,用8bit也就是1字節(jié)可以完美編碼,并且低7字節(jié)完全兼容。

      ASCII是國際標準而擴展ASCII并不是,下文所說到的“兼容ASCII”都是指兼容7bit的標準ASCII。

      GB2312

      GB2312使用1/2字節(jié)變長編碼,單字節(jié)部分是兼容ASCII,其他幾千個字符都是用雙字節(jié)編碼。

      GB2312在編碼的時候使用了一個“分區(qū)”的概念,小時候家里有一本區(qū)位碼表,就是配合Windows里古老的“區(qū)位輸入法”用的。

      GBK

      GBK的編碼方案是GB2312的超集,它完全兼容GB2312,不過把GB2312里面沒定義的那些編碼空間都用起來了。

      GB18030

      GB18030的編碼方案稍微復雜一點,它用的是1/2/4字節(jié)變長編碼方案。它完全兼容GB2312,基本上兼容GBK。

      Big5

      Big5使用固定兩字節(jié)編碼,它的首字節(jié)避開了ASCII的范圍,因此實際在程序實現上面它可以近似兼容ASCII,由于它的低字節(jié)包含了一些ASCII字符,這個兼容也是不完美的,具體情況可以看看維基百科,非常有趣。

      Unicode

      Unicode有一個非常高大上的中文名字叫萬國碼,呵呵,這個名字真是散發(fā)著一股農業(yè)重金屬的氣息啊。其實也是個字符集,它和UCS之間有微妙的高度雷同關系,好在兩邊的組織都意識到了搞分化是不好的,于是互相之間達成了高度的一致。雖然它們的確是兩個不同的標準,但很多時候混淆來看也無妨。

      Unicode是定長編碼,根據版本不同,它有2字節(jié)(對應UCS-2)、4字節(jié)(對應UCS-4)的版本。

      因為Unicode是定長的,它實在太簡單粗暴了。例如如果用4字節(jié)的Unicode來傳輸英文文本就浪費了3倍的體積,而用2字節(jié)的版本也不爽,一來容量較小,二來對于英文文本也還是浪費的。于是在實現上對它進行了一定的優(yōu)化,稱為Unicode轉換格式(Unicode Transformation Format)也就是我們耳熟能詳的UTF了。

      UTF-32

      UTF-32是UCS-4的最樸素的實現方式,就是簡單地用定長4字節(jié)。

      缺點嘛很明顯就是很浪費體積。

      優(yōu)點也是有的,首先就是把它轉換到Unicode最簡單,而且對于“第[i]個字符”這種隨機訪問也很好計算,直接字節(jié)數/4就是了對不?

      但因為組合字符(比如越南語,網上用來搞一個超長的流淚圖標破壞排版那種)的存在,一個UTF-32碼元(4字節(jié))嚴格上也并非一個文本編輯上的單元,這種情況下對于排版系統而言UTF-32沒有太多優(yōu)勢。

      UTF-16

      UTF-16是使用2/4字節(jié)實現的UCS-4變長編碼。

      因為大多數時候用到的字符不超過65536個,所以UTF-16在大多數時候1個字符都只占2字節(jié),這樣比起UTF-32省了接近一半體積,同時它的解析也不會太麻煩。

      固定長的編碼方式對于計算機程序而言有一個非常大的優(yōu)勢就是字符串處理會容易的多,尤其是正則表達式的實現。因此很多現代語言,例如C#/Java的字符串內部實現使用UTF-16,因為它是一種效率和體積比較平衡的編碼方式。

      UTF-8

      UTF-8應該是現在互聯網上使用最廣泛的統一語言編碼實現方式了。

      它是1-4字節(jié)變長編碼(原本是1-6字節(jié),但是因為后面那些超出了Unicode定義了,后來就改成1-4字節(jié)了)。單字節(jié)的情況兼容ASCII,在這個由英文主宰的互聯網環(huán)境里面這是非常好的特性,因為它在很多時候會非常節(jié)省體積,而且這種時候完全不需要編碼轉換。

      但它的缺點也相當明顯,將UTF-8轉換到Unicode的算法會更加復雜,效率降低。

      對于中文環(huán)境而言UTF-8也比較吃虧,因為使用UTF-8編碼大多數中文字符需要3字節(jié),這就比GB系列和UTF-16浪費空間。

      UTF-8并未編碼0x10FFFF以上的部分,所以嚴格的說它只是UCS-4的子集。好在缺失的那部分本身就不受UCS/Unicode的重視,估計實在是太犄角旮旯了。

      我覺得UTF-8最終成為互聯網主流很大一定程度是因為它的單字節(jié)是兼容ASCII的。

      階段性小結

      字符集

      收錄了很多字符,并且編號,給人看的。

      編碼

      實現一個字符集,將它的編號以一定規(guī)則用二進制實現,給計算機看的。

      GB系列

      中國的國標字符集/編碼,GB2312和GBK已經基本上過時了,如果要良好的支持中日韓文,又逃不開GBK的魔爪(比如歷史代碼束縛),那可以考慮升級到GB18030,這是國標的最新版,也是最先進的一版。

      UCS/Unicode

      把全世界上百萬個你見過的或者你沒見過的字符全部收錄進一套字符集,已經被全世界接受成為了國際標準。

      UTF

      UCS/Unicode轉換格式,就是實用的編碼方案,用于計算機實現。

      UTF-16

      UCS/Unicode的一種折衷了處理效率和存儲空間的編碼實現方案,常被各種現代語言當作字符串內部編碼使用。

      UTF-8

      UCS/Unicode的一種傾向于節(jié)省空間的編碼實現方案,因為對ASCII兼容,對英文文本非常有利,成為了當今互聯網的主流(甚至事實標準)。

      如果你的網站沒有任何歷史包袱,直接上UTF-8別商量!

      如果你的網站有一些歷史包袱,商量商量還是上UTF-8吧,包袱的接口上轉換一下編碼。

      預報

      呵呵呵呵,雖然文章的標題叫做《編碼歪傳》,但其實上面的內容一點也不歪嘛。

      有觀眾看不下去了:“拜托,你講這些什么亂七八糟的理論知識我沒啥興趣啊,我想知道的其實只是為什么我的網頁會亂碼啊老濕!”

      對于上面的問題我只想說四個字:請聯系我請看下集:《編碼歪傳——Web篇》

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多