常見字符編碼方式及Base64,url


  • 無論是全球哪種文字,只需要保存文件的時候,保存成UNICODE編碼就可以被其他電腦正常解釋。

  • UTF-8等編碼體積比較大,占電腦空間比較多,如果面向的使用人群絕大部分都是中國人,用 GBK等編碼也可以。

各個字符編碼特征

字節”是一個8位的物理存貯單元,而“字符”則是一個文化相關的符號。

  • Ascii

    (American Standard Code for Information Interchange,美國信息互換標准代碼)

    • 1個字節
字符值 0 A a
十進制 48 65 97
  • GBK

    (Guo Biao Kuozhan 國標擴展(碼))

    • 兩字節長的漢字字符一字節長的英文字符並存於同一套編碼方案里
  • Unicode

    (Universal Multiple-Octet Coded Character Set,簡稱UCS, 俗稱unicode),嚴格來說unicode屬於字符集,而不是編碼,編碼用utf

    • 分為UCS-2(標准的2字節形式),UCS-4(4字節形式)
    • \u開頭是unicode
  • utf-8

    (UCS Transfer Format -8)

    • 一種變長的編碼方式,可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度
    • 當字符在ASCII碼的范圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做為它的一部分,
    • UTF-8一個中文字符占3個字節。
    • 從unicode到utf-8並不是直接的對應,而是要過一些算法和規則來轉換。
    • 因為utf-8編碼的字符串長度和字符個數沒有固定換算關系,導致排版,排序之類的復雜度上升。所以用unicode存儲。
    • utf以\x開頭

字符編碼發展過程

這里只介紹常見的 ,非時間順序

  • 計算機能夠處理二進制數據,早期人們決定用8個可以開合的晶體管來組合成不同的狀態,稱為“字節”,美國制定Ascii來保存英文文字

    • 把所有的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第127號。
  • 127號之后的空位來表示這些新的字母、符號,還加入了很多畫表格時需要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最后一個狀態255。從128 到255這一頁的字符集被稱“擴展字符集”。

  • 但是中國漢字太多,經過在GB2312編碼一系列擴展后形成GBK標准的編碼方案

    • 把漢字、數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 里本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的“全角”字符,而原來在127號以下的那些就叫“半角”字符了
  • 由於像GBK一樣各個國家都有自己的編碼標准,為了統一,國際標准化組織ISO重新搞一個包括了地球上所有文化、所有字母和符號的編碼unicode

    • 直接規定必須用兩個字節
  • 對於ASCII里的那些“半角”字符,unicode保持其原編碼不變,只是將其長度由原來的8位擴展為16位,其高8位永遠是0,浪費空間

  • 為解決unicode如何在網絡上傳輸的問題,於是面向傳輸的眾多UTF標准出現了,UTF-8就是每次8個位傳輸數據,而UTF-16就是每次16個位

Base64

用途

  • 嚴格來說base64不能算是一種加密,只能說是編碼轉換。使用base64的初衷。是為了方便把含有不可見字符串的信息用可見字符串(Ascii)表示出來,以便復制粘貼

  • 如果在網絡上直接傳輸二進制,比如圖片,或者字符,需要用4/3倍帶寬傳輸數據的Base64究竟有什么意義?

    • 真正的原因是二進制不兼容。某些二進制值,在一些硬件上,比如在不同的路由器,老電腦上,表示的意義不一樣,做的處理也不一樣。同樣,一些老的軟件,網絡協議也有類似的問題。

    • 但是萬幸,Base64使用的64個字符,經ASCII/UTF-8編碼后在大多數機器,軟件上的行為是一樣的。Base64能夠將任何數據轉換為易移植的字符串,避免了傳輸過程中失真問題

特征

  • Base64編碼是從二進制值到某些特定字符(英文大小寫、數字和+、/以及用作后綴等號)的編碼,這些特定字符一共64個,所以稱作Base64。
  • base64是把3個字節變成4個可打印字符,所以base64編碼后的字符串一定能被4整除(不算用作后綴的等號)
  • 等號一定用作后綴,且數目一定是0個、1個或2個。這是因為如果原文長度不能被3整除,base64要在后面添加\0湊齊3n位。為了正確還原,添加了幾個\0就加上幾個等號。顯然添加等號的數目只能是0、1或2;

URL編碼

規則

目前比較常見的就是把字符轉化為utf-8的十六進制,每個字節用%開頭

Refer:

[1]Unicode 和 UTF-8 有什么區別? - 盛世唐朝的回答 - 知乎

[2]為什么要使用base64編碼,有哪些情景需求? - wuxinliulei的回答 - 知乎

[3]密碼學 | Base64是加密算法嗎? - 彭旭銳的文章 - 知乎

[4]計算機中為何不直接使用 UTF-8 編碼進行存儲而要使用 Unicode 再轉換成 UTF-8 ? - Ivony的回答 - 知乎

[5]程序員必備:徹底弄懂常見的7種中文字符編碼 - 騰訊的文章 - 知乎

[6]為什么要使用base64編碼,有哪些情景需求? - Wang Kai的回答 - 知乎

[7]為什么要使用base64編碼,有哪些情景需求? - wuxinliulei的回答 - 知乎

[8]如何用通俗易懂的語言解釋base64? - 劉巍然-學酥的回答 - 知乎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM