對 Unicode UTF 8 的一些理解

2021-08-11 18:36:32 字數 1841 閱讀 1313

之前沒搞明白 iso8859-1、ascii、gb2312、gbk、unicode、utf-8 的關係,因此總是覺得雲裡霧裡。

首先,要明白 iso8859-1、ascii、gb2312、gbk,它們既是字符集,又是編碼方式。

而 unicode,它只是字符集。它對應的編碼方式有好幾種,分別是 utf-8 、utf-16 等。

搞清楚,unicode 只是字符集(不像 iso8858-1、ascii、gb2312、gbk,它們既是字符集,又是編碼方式),而 utf-8 是它的編碼方式,所謂的 utf,就是 unicode transformation format,即 unicode 格式轉換。

unicode 用 2 個位元組表示所有常用的字符集,utf-16 用 2 個位元組編碼 unicode 字元。

上面的句子很好理解。但下面的句子可能就不好理解了。

unicode 用 2 個位元組表示所有常用的字符集,utf-8 用 1 到 6 個位元組編碼 unicode 字元。

這是什麼意思呢?

既然 unicode 用兩個位元組表示所有的字符集,那編碼方式不也是用兩個位元組來表示字元嗎?

不是的。而且正是從 unicode 開始,字元的定義與儲存是分離的。而在早前的 iso8859-1、gbk 等,字元的表示與儲存是相結合(也就是前面說的它們既是字符集又是編碼方式)。

但實際上,字元的表示和儲存是可以分離的。因此,對於 unicode 字符集,有著 utf-8 和 utf-16 編碼方式。而這其中,utf-16 正是用兩個位元組來儲存 unicode 字元的。那「unicode 用 2 個位元組表示所有常用的字符集,utf-8 用 1 到 6 個位元組編碼 unicode 字元。」這句話要怎麼理解呢。往下看就能明白了。

其實要理解 utf-8,先來理解 utf-16 會更好。

utf-16 是編碼方式,表示任何字元對應的數字都用兩個位元組來儲存。它跟 unicode 很像,但是 unicode 是字符集,是用來表示字元的,而 utf-16 則是在計算機中儲存字元對應的數字的。嗯,這就是 utf-16 編碼。

那既然有 utf-16 為什麼我們還需要 utf-8 呢,這是因為 utf-16 編碼,即使是字母字元,也要用兩個位元組來儲存。這比使用 iso8859-1 編碼方式,佔的空間大了一倍。這不好,因此就引出了 utf-8,utf-8 編碼是可變位元組編碼,對於字母字元,它使用乙個位元組來儲存。這樣相對於 utf-16,就節省了很多空間啦。

但是由於是可變位元組,計算機總得知道每次要讀取多少個位元組吧(也就是說多少個位元組才是乙個單元)。因此,utf-8 編碼需要定義一些規則——位元組中有些位數是用來做標誌位。具體情況如下:

0******,表示乙個位元組為單元;(計算機讀取位元組的時候,發現該位元組以0開頭,就表示乙個位元組為乙個單元)

110***xx,表示兩個位元組為單元,後面緊跟著的是另乙個位元組:10******;(計算機讀取位元組的時候,發現該位元組以 110 開頭,就明白這是以兩個位元組為乙個單元的,因此還得往後再讀乙個位元組,且下乙個位元組一定是以 10 開頭)

1110***x,表示三個位元組為單元,後面緊跟著的是另外兩個位元組:10****** 10******。(計算機讀取的過程類似上一步)

正因 utf-8 編碼中位元組的部分位數要用來做標誌位,因此無法用兩個位元組來儲存所有的字符集,因此會出現用三個位元組來儲存,甚至更多的位元組來儲存乙個字元。然而這和 unicode 的兩個位元組表示乙個字元並不矛盾。乙個是表示,乙個是儲存,是不一樣的。

如果你看完也不知道我在說些什麼也是正常的吧,畢竟其中還有很多很多知識沒提到。畢竟以上,是在看了很多很多篇相關的文章也看了好幾次才出來的一些知識點。

相關的文章,我覺得寫得挺好的有:

如果有**寫錯了,麻煩大家可以幫忙指出,謝謝!

對k8s service的一些理解

service是乙個抽象概念,定義了乙個服務的多個pod邏輯合集和訪問pod的策略,一般把service稱為微服務 舉個例子乙個a服務執行3個pod,b服務怎麼訪問a服務的pod,pod的ip都不是持久化的重啟之後就會有變化。這時候b服務可以訪問跟a服務繫結的service,service資訊是固定...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...

對synchronized this 的一些理解

一 當兩個併發執行緒訪問同乙個物件object中的這個synchronized this 同步 塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個 塊以後才能執行該 塊。二 然而,當乙個執行緒訪問object的乙個synchronized this 同步 塊時,另乙個...