日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unicode和UTF-8的区别

發布時間:2025/3/19 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unicode和UTF-8的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概念:

本質上來說:

Unicode 是「字符集」

UTF-8 是「編碼規則」

字符集:為每一個「字符」分配一個唯一的 ID(學名為碼位 / 碼點 / Code Point);

編碼規則:將「碼位」轉換為字節序列的規則(編碼/解碼 可以理解為 加密/解密 的過程)

二、案例:

每一個字符對應一個十六進制數字。
計算機只懂二進制,因此,嚴格按照unicode的方式(UCS-2),應該這樣存儲:
I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
報 01100010 10100101
這個字符串總共占用了18個字節,但是對比中英文的二進制碼,可以發現,英文前9位都是0!浪費啊,浪費硬盤,浪費流量。

UTF-8是這樣做的:

  • 單字節的字符,字節的第一位設為0,對于英語文本,UTF-8碼只占用一個字節,和ASCII碼完全相同;
  • n個字節的字符(n>1),第一個字節的前n位設為1,第n+1位設為0,后面字節的前兩位都設為10,這n個字節的其余空位填充該字符unicode碼,高位用0補足。
    這樣就形成了如下的UTF-8標記位:
  • 0xxxxxxx
    110xxxxx 10xxxxxx
    1110xxxx 10xxxxxx 10xxxxxx
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    ... ...
    于是,”It's 知乎日報“就變成了:
    I 01001001
    t 01110100
    ' 00100111
    s 01110011
    00100000
    知 11100111 10011111 10100101
    乎 11100100 10111001 10001110
    日 11100110 10010111 10100101
    報 11100110 10001010 10100101
    和上邊的方案對比一下,英文短了,每個中文字符卻多用了一個字節。但是整個字符串只用了17個字節,比上邊的18個短了一點點。
    python是支持Unicode的,在使用Unicode時,在字符串前加上u即可。

    ?

    三、前因后果

    ?

    ASCII碼:是用一個字節(8bit, 0-255)中的127個字母表示大小寫字母,數字和一些符號.主要用來表示現代英語和西歐語言。

    所以處理中文就出現問題了,因為中文處理至少需要兩個字節,所以中國制定了GB2312。

    所以,各國制定了各國的標準。日本制定了Shift_JIS,韓國制定了Euc-kr。。。那么,亂碼就來了。

    ?

    為了統一,Unicode誕生了。統一碼把所有語言都統一到一套編碼里。解決了亂碼問題,但是存儲和傳輸效率低下的問題又來了。

    因為ASCII編碼是1個字節,而Unicode編碼通常是2個字節。你表示一個英文字母一個字節就夠了,但是Unicode卻不得不用兩個字節來表示(另一個字節補0)。

    四、結論:

    unicode是靜態的,而且是固定長度的,一一對應;unicode-8是一套規則,字長是可變的,即對應的字符結果是可變的。

    ?

    為了節約,出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間(ASCII碼可以看成是UTF-8的一部分,所以大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作)。

    ?

    說到編碼,得先從ASCII編碼講起。ASCII編碼是由美國人發明,美國的字符不超過255個,所以ASCII編碼使用了8bit 即一個字節來存儲字符。由于漢字的數量遠超255個,所以中國自己發明了一個GB2312編碼來表示漢字,一般的漢字使用2個字節,對于一些生僻的漢字則使用更多的字節來表示,當然,GB2313編碼是可以兼容ASCII碼的。

    ????????然后,日本,韓國等等國家也自己發明了一套編碼方法,這時候又出現了一個新的問題。如果一篇文章里面,即有中文,又有日文的話,無論使用中文的編碼方法還是使用日文的編碼方法都會出現亂碼。隨后,unicode編碼便應運而生。unicode編碼對文字的編碼進行了統一,當然,unicode只是一種編碼規范,它有多個版本,常用的unicode編碼使用了16位來存儲字符,16位的存儲空間足以容納世界上所有書面字符(對于漢字來說,一共有6萬多個,只能包含其中的一些常用漢字,所以unicode編碼對于漢字的兼容性并不是特別好)。unicode編碼兼容了ASCII碼,ASCII碼轉unicode編碼時,保持后8位不變,前8位只需要用0去補全即可。

    ????????使用了unicode編碼后,又有新的問題出現。因為unicode編碼是用兩個字節來存儲字符,如果一篇文章中,大部分都是英文,使用unicode編碼就會造成空間的浪費,對英文部分使用ASCII碼只需要一個字節就可以了。這時候,utf-8解決了這個問題。utf-8是一種可變長的字符編碼,當存儲英文時只使用一個字節,節省了一半的空間,而存儲中文字符時,長度還是不變。utf-8雖然壓縮了存儲空間,但是如果在內存中存儲,使用utf-8卻由于它的長度不固定,帶來了很大的不便,使得在內存處理字符變得復雜。應對這個問題的解決策略是:在內存中存儲字符時還是使用unicode編碼,因為unicode編碼的長度固定,處理起來很方便。而在文件的存儲中,則使用utf-8編碼,可以壓縮內存,節省空間。這里一般有個自動轉換的機制,即從文件中讀取utf-8編碼到內存時,會自動轉換為unicode編碼,而從內存中將字符保存到文件時,則自動轉換為utf-8編碼。

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的Unicode和UTF-8的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。