簡單的理解unicode和utf 8的關係

2021-06-23 04:24:37 字數 1659 閱讀 8218

目前,做了個簡單的爬蟲程式,爬取到utf-8的頁面中竟然存在著混合了unicode的編碼字串的字串 例如   \u1234中文

先說說如何將unicode的編碼字串轉換成相應的編碼物件

就想著用正則先將unicode過濾出來

正則式是(

\\u[0-9,a-f])

然後取出\u***x 後面四位編碼 例如:\u65e0\u804a 取出來就是   65e0 和 804a

然後使用,

string.valueof((char)integer.parseint("65e0",16));

就能得到相應的unicode的編碼物件  「無聊」

在做測試的時候

如果你採用new string("\u65e0\u804a ")你是直接得到漢字「無聊」的

但是如果如果是採用的是一些外部讀入的方式

得到的就是"\u65e0\u804a "  需要通過上面的方式進行轉換

unicode-table

在這裡 你能看到所有的unicode

為了了解unicode就去查了下unicode,下面都是個人的低階見解:

首先我們需要理解下字元編碼

字元編碼: wiki給出的解釋:字集碼是把字符集中的字元編碼為指定集合中某一物件(例如:位元模式、自然數序列、8位組或者電脈衝),以便文字在計算機中儲存和通過通訊網路的傳遞。說簡單點就是   為了方便計算機識別和傳輸而定義出來的字元的代號。

問題來了:

大家都定義了自己的編碼方式,日本人用日本shift_jis編碼的檔案,我們用中文編碼系統開啟就會是亂碼

世界上那麼多的字,有的沒的,誰知道啊。所以就有了unicode的存在,

總不能像office那樣 什麼編譯碼檔案都裝全了吧

所以unicode就為全世界所有的(絕大部分存在的)文字和符號都定義了相應的編碼,隨著文字的不斷的增加,可以發現,用來定義編碼的位元組會從乙個位元組變成兩個位元組(ucs-2用兩個位元組編碼),變成三個位元組,變成四個位元組(ucs-4用4個位元組編碼)。而本身英文只佔乙個位元組,中文佔兩個位元組,問題來了,編碼已經比它所代表的文字佔的儲存空間大了。

現在理解起來就會簡單了,為什麼會有utf-8的存在,就是為了壓縮unicode編碼儲存空間

utf-8以位元組為單位對unicode進行編碼。從unicode到utf-8的編碼方式如下:

unicode編碼(十六進製制)

utf-8 位元組流(二進位制)

000000 - 00007f

0******x(ascii字元 )

000080 - 0007ff

110***xx 10******

000800 - 00ffff

1110***x 10****** 10******

010000 - 10ffff

11110*** 10****** 10****** 10******(注意紅字部分,幾個1,就代表當前字元的編碼有幾個位元組組成,解碼時邊會直接往後面位元組讀取)

例如"a"= 0x0043  utf-8只需要儲存乙個utf-8的位元組流就行了

而中文「楊」是0x6768  utf-8就需要3哥utf-8的位元組流去表示

至於utf-16和utf-32 都是以無符號的整數為單位



將unicode編碼的txt檔案轉為utf 8編碼

利用codes編寫 coding utf 8 import string import codecs def changecode tt codecs.open c 111.txt rb utf 16 111.txt為unicode編碼檔案,以unicode編碼開啟,utf 16 unicode m...

對 單元測試 UT 的理解

1 單元測試與敏捷開發的衝突點 現在很多公司都推行敏捷開發 與 邏輯不同步的ut沒有意義 而ut 維護是需要成本的 參考 2 從專案的長期角度來看 好的ut對團隊整體開發效率有比較大的提公升,同時可以提高 質量 減少程式缺陷 最大限度地規避線上故障。但過大的ut成本佔比,可能是專案接受不了的。建議 ...

Unicode編碼方式的理解

unicode簡單來說就是對世界上所有的字元進行了統一的編碼。1 unicode和非unicode的區別 unicode字串 1 nchar n個字元的固定長度的unicode字元資料。n值必須在1 4000之間。儲存大小為兩倍的n位元組。unicode用法和普通字串的用法一致,但是unicode支...