幫你搞清ASCII、Unicode和UTF-8區別,拿走不謝

2020-11-13 品位集結號

首先說一下背景:由於計算機是美國人發明的,因此最早只有127個字母被編碼到計算機中,也就是大小寫英文字母、數字和一些符號,這個編碼表稱為ASCII編碼。

例如:大寫字母A的編碼是65,小寫字母z的編碼時122。

要處理中文,顯然一個字節是不夠的,至少需要兩個字節,且不能和ASCII編碼衝突,所以我國制定了GB2312編碼,用於把中文編進去。

可以想像,全世界上有上百種語言,日本把日文編寫到Shift_JIS裡,韓國把韓文編寫到Euc-kr裡,各國有各國的標準,就不可避免出現衝突,結果就是,在多語言混合的文本中就會顯示亂碼。


在此背景下,Unicode應運而生,Unicode把所有語言都統一到一套編碼裡,這樣就不會有亂碼問題了。

Unicode標準在不斷發展,最常用的是用兩個字節表示一個字符(如果要用到非常生僻的字符,就需要4個字節)。現代作業系統和大多數程式語言都直接支持Unicode。

下面看看ASCII編碼和Unicode編碼的區別:ASCII編碼時1個字節,二Unicode編碼通常是兩個字節。

字母A用ASCII編碼是十進位的65,二進位的01000001。

字符0用ASCII編碼是十進位的48,二進位的00110000。

注意字符0和整數0是不同的。

漢字「中」已經超出了ASCII編碼的範圍,用Unicode編碼是十進位的20013,二進位的01001110 00101101。

如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可,因此A的Unicode編碼是00000000 01000001。

那麼新的問題就出現了:如果統一成Unicode編碼,亂碼問題從此消失了,但是寫的文本基本上全部是英文時,用Unicode編碼比ASCII編碼多一倍存儲空間,在存儲和傳輸上十分不划算。

本著節約的精神,又出現了把Unicode編碼轉化成為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1~6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4~6個字節。如果你要傳輸的文本包含大量英文字母,用UTF-8編碼就會節省空間。

各編碼方式的比較

由上表可知,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可看成是UTF-8編碼的一部分,所以只支持ASCII編碼的大量歷史遺留軟體可在UTF-8編碼下繼續使用。


搞清楚ASCII、Unicode和UTF-8的關係後,可總結一下現在計算機系統通用的字符編碼工作方式:在計算機內存中,統一使用Unicode編碼,當需要保持到硬碟或需要傳輸時,可轉換為UTF-8編碼。

例如,用記事本編輯時,從文件讀取的UTF-8字符轉換為Unicode字符到內存;編輯完成後,保持時再把Unicode轉換為UTF-8保持到文件。

瀏覽網頁時,伺服器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器,如下圖所示:

我們經常看到很多網頁的源碼上有類似<meta charset=』UTF-8』/>的信息,表示該網頁用的是UTF-8編碼。

相關焦點

  • 計算機編碼ASCII、GBK、Unicode、UTF-8和URL編碼的區別
    這裡就有幾個嚴重的問題,第一個問題是,計算機如何才能區別 Unicode 和 ASCII ?還有計算機怎麼知道三個字節表示一個符號,而不是分別表示三個符號呢?所以utf-8編碼是"‭E8BFB7‬"Python中Unicode字符轉UTF-8編碼:>>>'迷'.encode('utf-8')b'\xe8\xbf\xb7'那麼如何區分utf-8各個字符的?
  • Golang 中的 Unicode 與 UTF-8
    至於 Unicode 本身,你可以認為它就是 Code point 的集合,而 UTF-8 呢?就是 Unicode 的編碼方式。(&34;, []byte(`:joy:`)) r, _ := utf8.DecodeRuneInString(`:joy:`) fmt.Printf(&34;, r) fmt.Printf(&34;, r)}Unicode
  • Cpython源碼閱讀16-Unicode字符串底層存儲結構
    (unicode).ready = 1; _PyUnicode_STATE(unicode).ascii = is_ascii; //實際data使用的編碼字節 if (is_ascii) { ((char*)data)[size] = 0; _PyUnicode_WSTR(unicode) = NULL; }
  • UNICODE,GBK,UTF-8區別
    我很早前就發現Unicode、Unicode big endian和UTF-8編碼的txt文件的開頭會多出幾個字節,分別是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但這些標記是基於什麼標準呢?
  • UTF-8 GBK UTF8 GB2312 Unicode 間核心區別關係
    二、常見的UTF-8、GBK、Unicode之間的區別和聯繫Unicode是國際通用的一種編碼標準,它包含著世界上各個國家的所有符號且每一個符號都對應著一個全球唯一的數字。西方人提出了一種編碼方式就是utf-8(utf16/utf32),是變長編碼,英文只用一個字節即可,漢字要用三個字節;針對漢字編碼的問題,專門提出了gbk,每個符號用兩個字節表示,比utf8的方式佔用資源少。因此,處理的文本主要為中文時最好用gbk編碼,英文較多時用utf8編碼。gbk和utf8兩種編碼之間轉換要通過unicode來間接實現。
  • 從ASCII碼->Unicode->UTF-8歷史變遷,及其差異
    unicode在很長一段時間內無法推廣,直到網際網路的出現,為解決unicode如何在網絡上傳輸的問題,於是面向傳輸的眾多 UTF(UCS Transfer Format)標準出現了。顧名思義,UTF-8就是每次8個位傳輸數據,而UTF-16就是每次16個位。
  • Unicode UTF-8 UTF-16 UTF-32的關係
    ASCII編碼使用 8bit (b0-b7)中的最高位b7位作為奇偶校驗位,用來保障傳輸的可靠性,所以ASCII一共定義了2^7=128個字符集合。 所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。
  • python中str字符串和unicode對象字符串的拼接問題
    字節碼是怎麼存的:如果這行代碼在python解釋器中輸入&運行,那麼s的格式就是解釋器的編碼格式;如果這行代碼是在源碼文件中寫入、保存然後執行,那麼解釋器載入代碼時就將s初始化為文件指定編碼(比如py文件開頭那行的utf-8);unicode對象字符串unicode是一種編碼標準,具體的實現可能是utf-8,utf-16,gbk等等,這就是中文字符串和
  • VC|字符編碼與字符集ASCII、Unicode及文件
    -8" /^> >>more.htmlecho ^<head^> >>more.htmlecho ^<title^>contents^</title^> >>more.html生成的more.html文件對應的存儲方案就是chcp 65001對應的存儲方案,也就是utf-8。
  • 不用再為神奇的ASCII,Unicode字符編碼頭痛了!一文讓你弄懂編碼
    從unicode到utf-8並不是直接的對應,而是要過一些算法和規則來轉換。UTF-8是這樣做的:1. 單字節的字符,字節的第一位設為0,對於英語文本,UTF-8碼只佔用一個字節,和ASCII碼完全相同;2. n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,後面字節的前兩位都設為10,這n個字節的其餘空位填充該字符unicode碼,高位用0補足。
  • Python並發編程很簡單,一文幫你搞清如何創建線程類
    對於Python的並發編程相關的東東,相信通過上次咱們的探討,大家已經比較清楚了,對於Python創建線程的方式主要有兩種,這個上次咱們也已經說過了哦,第一種是使用threading模塊的Thread類的構造器來創建線程,這種方式上次咱們已經詳細討論過了哦,這次呢,咱們就重點和大家來聊聊第二種方式吧
  • Windows用iconv轉換utf-8等777種代碼
    pandoc轉換的書籍常常會有編碼的問題,而導致不能直接運行其中的代碼,這個時候需要iconv工具,將utf-8轉換成ascii只需要一行代碼:iconv -f utf-8 -t ascii//translit a.md > b.md安裝iconv需要scoop工具:PS C:\Users\gaowei
  • unicode_stop 中文man頁面
    unicode_stop 中文man頁面 unicode_stop 撤銷以前 unicode_start(1) 命令的效果, 將顯示屏和鍵盤設回到 8-bit 模式.
  • PHP獲取漢字unicode碼的通用函數
    把一個漢字轉為unicode的通用函數,不依賴任何庫,和別的自定義函數,但有條件:本文件以及函數的輸入參數應該用utf-8編碼,不然要加函數轉換。 <?
  • Unicode及程式語言中的UTF-8字符串引策略
    在本文中,蟲蟲將來大家說說Unicode編碼,以及實例討論UTF-8在Emacs Lisp,Julia和Golang語言的編碼和索引策略。Unicode和編碼空間蟲蟲以前文章中,我們提到了為了表示世界上上使用的各種語言和符號,開發了一個通用的編碼體系Unicode。
  • 天熱了,教你簡單又美味的涼拌麵做法,配方在這裡,拿走不謝!
    天熱了,教你簡單又美味的涼拌麵做法,配方在這裡,拿走不謝!天熱了,教你簡單又美味的涼拌麵做法,配方在這裡,拿走不謝!製作涼拌麵好吃最重要的就是它的涼拌料汁兒,學會這種萬能調料汁兒拌什麼麵條都好吃,做料汁的時候,首先我們要準備好這幾樣食材,生薑,大蒜,蔥花,辣椒圈兒。把這些食材全部放進乾淨的容器中,加入一勺生抽,一勺老抽,一勺香油,一勺蠔油,適量的食用鹽和雞精,攪拌均勻。添加少量的涼白開,攪拌成料汁。