天天看點

快速搞懂Unicode,ASCII,UTF-8,代碼點,編碼

作者:嵌入式xff

上一篇關于這個話題講到了總結法則,這篇就來具體看一看吧!

第一,要将一串的位元組翻譯成人類了解的字位。首先必須要知道原始編碼。

第二,在Unicode中字位非代碼點,非位元組,這個是非常重要的,因為在很多語言中,字元串操作庫隻對位元組生效。在ASCII中沒問題,因為字位與位元組一一對應,Unicode中就不行了,這個例子是Python2的原生字元串,len()函數傳回字元串中位元組數即4,而不是字位或者代碼點的1,此外如果我們檢視字元串索引,得到點贊表情每個代碼點的UTF-8位元組,其實沒有什麼用,這些函數稱為“Unicode不知所雲/un'',因為他們操縱位元組,卻不知背後含義,你可能更希望用代碼點來索引字元,要實作就要用到u指定符,使其成為可識别的Unicode字元串,這樣len()和索引就是我們要的了,來看另一個例子:點贊結合如上色塊,一個字位兩個代碼點,應該像這樣,但我的終端實際無法正确渲染,使用len(s)得到8,因為兩個代碼點每個占四位元組,當我們使用u(),得到代碼點長度為2。

快速搞懂Unicode,ASCII,UTF-8,代碼點,編碼

很嚴肅的事情,因為天真的操縱字元串中位元組内容可以很容易出現亂碼。來看看ellipsis函數,文本太長就會截斷變為...,如果用unicode的un函數,可能會多算字元串的長度。因為計算位元組而不是代碼點,第二你可能會在代碼點中間切斷字元串,破壞字元串。如果你用u函數,會得到一個更準确的計數。但依舊無法很好處理混合修飾符,也可能在中間切斷。

快速搞懂Unicode,ASCII,UTF-8,代碼點,編碼

如果你想按照人類可感覺單元處理字位,你可能要用到一個特殊的庫,知道點贊修改顔色後是一個字位,我鼓勵大家用最喜歡的程式設計語言,嘗試使用其他字元串函數,去看他們如何處理複雜的字位,像點贊結合顔色的修改器,來再增加一條總結。

第三,使用un函數,隻當每個字位是一個位元組,這僅是ASCII情況。UTF-8中也隻有ASCII字元,使用u()來操控代碼點,為了更準确的字元串操控和長度計算,最後可以使用可識别字位的字元串函數,最大精确的來處理使用者可感覺的字元,停在點贊表情的代碼點頁面,看到頁面中的名字,代碼點值0x1f44d,十進制128077,以及不同的編碼政策下的編碼,以及UTF-8/32和并未讨論的UTF-16,如果你之前也對Unicode困惑,希望現在可以清楚一些,最後給大家一個彩蛋,關于一些資料的分享,加微信領取資料。

快速搞懂Unicode,ASCII,UTF-8,代碼點,編碼
快速搞懂Unicode,ASCII,UTF-8,代碼點,編碼