老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Golang中Unicode與UTF-8有什么區別

Golang中Unicode與UTF-8有什么區別,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

成都創新互聯公司專注為客戶提供全方位的互聯網綜合服務,包含不限于網站建設、做網站、卓資網絡推廣、重慶小程序開發、卓資網絡營銷、卓資企業策劃、卓資品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯公司為所有大學生創業者提供卓資建站搭建服務,24小時服務熱線:18982081108,官方網址:www.cdcxhl.com

Unicode 與 UTF-8 編碼

下面的圖來自 UTF-8 的截圖:

Golang中Unicode與UTF-8有什么區別

這幅圖簡單明了的告訴我們,UTF-8 的編碼方式,比如漢字一般用三個 Byte,每個 Byte 的開頭都是固定的,各種文字軟件解析 UTF-8  編碼的時候,它就會按照這個格式去解析,一旦解析錯誤(畢竟還可能會有不符合要求的數據,或者是文件錯誤了),錯誤的字節就會被替換為 “?”  (U+FFFD),然后神奇的地方就來了: 即使遇到這種錯誤,它也不會影響接下來的其他字符的解析 ,因為這種編碼不必從頭開始,使得它可以  自我同步(Self-synchronizing) 。與此同時,其它的一些編碼一旦遇到錯誤編碼就會出問題,導致錯誤編碼之后的正確編碼也會跟著出錯。

當然,UTF-8 編碼也有缺點,由于它是可變的,當英文字符偏多的時候,它會省空間,然而比如當中文偏多的時候,它理論上(3 Byte)會比 GBK 編碼(2  Byte)最多多出 1/3 的存儲空間。

UTF-8 的例子

我們拿 Unicode 中最受歡迎的 Emoji 表情 :joy: 1 來舉例:它的 Code point 是 U+1F602 (對, 1F602 是以  16 進制表示的),然而在內存中它的存儲方式的卻是 0xf09f9882 ,為什么?這就是 UTF-8 的編碼了(注意對比上圖的編碼方式):

000    011111    011000    000010 1f602 11110000  10011111  10011000  10000010 f0 9f 98 82

通過把 UTF-8 的編碼格子里面數據提取出來,我們就能獲得 Code point 1F602 。

你也可以用 Golang 來查看其它字符的編碼:

package main import (    "fmt"     "unicode/utf8" )func main() {     fmt.Printf("%b\n", []byte(`:joy:`))     fmt.Printf("% x\n", []byte(`:joy:`))         r, _ := utf8.DecodeRuneInString(`:joy:`)     fmt.Printf("% b\n", r)     fmt.Printf("% x\n", r) }

Unicode 的其他編碼

Unicode 當然不止一種編碼,還有 UTF-16、UTF-32 等,它們的關系就是 UTF-16 用 2 個 Byte 來表示 UTF-8 分別用  1/2/3 個 Byte 來表示的字符,然后 4 個 Byte 與 UTF-8 一致,UTF-32 是完全用 4 個 Byte  來表示所有的字符,另外,詳細的可以在 Comparison of Unicode encodings 中看到,

好,基礎講完,現在開始正式介紹。

Unicode 與 Golang 2

這里特別需要提到的是 Golang 與 UTF-8 的關系,他們背后的男人,都是 Ken Thompson 跟 Rob Pike 3 4 5  ,由此,大家就會明白 Golang 的 UTF-8 設計是有多么重要的參考意義。比如 Golang 設計了一個 rune 類型來取代 Code point  的意義。

rune 看源碼就知道,它就是 int32,剛好 4 個 Byte,剛可以用來表示 Unicode 的所有編碼 UTF-8 與 UTF-16。

在繼續之前,我想幫各位明白一個事實:Golang 的源碼是默認 UTF-8  編碼的,這點從上面我給出的例子中就能明白,所以表情字符在編譯的時候,就已經能被解析。

好了,那么我們來看看 Golang 的 unicode 包,其中就會有很多有用的判斷函數:

func IsControl(r rune) bool func IsDigit(r rune) bool func IsGraphic(r rune) bool func IsLetter(r rune) bool func IsLower(r rune) bool func IsMark(r rune) bool func IsNumber(r rune) bool func IsPrint(r rune) bool func IsPunct(r rune) bool func IsSpace(r rune) bool func IsSymbol(r rune) bool func IsTitle(r rune) bool func IsUpper(r rune) bool

另外,在 src/unicode/tables.go 中,有大量的 Unicode 中,各類字符的 Code point  區間,會有比較大的參考價值。

再看看 unicode/utf8 包,這里面的函數,大多數時候你都用不到,但是有這么幾類情況就需要你必須得用到了:

  • 統計字符數量;

  • 轉編碼,比如將 GBK 轉為 UTF-8;

  • 判斷字符串是否是 UTF-8 編碼,或者是否含有不符合 UTF-8 編碼的字符;

后面兩個可以忽略,第一個需要特地提醒下:

s := `:joy:` fmt.Println(len(s))

這句輸出是什么?上面提過了,剛好就是 4。于是,你不能使用 len  來獲取字符數量,也就不能以此來判斷用戶輸入的字符是不是超過了系統的限制。另外,你也不能通過 s[0] 這樣的方式來獲取字符,因為這樣你只能取到這 4 個  Byte 中的第一個,也就是 0xf0 。

你應該做的就是把 string 轉為 rune 數組,然后再去進行字符的操作。

具體的使用方法就不細談了,相信你們能搞定。

另外,這里需要另外提示下,在 Node.js 中,string 本身就是 Unicode,而不是像 Golang 的 string  是二進制,因此在這里可以認為 Node.js 的 Buffer 才是 Golang 中的 string。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。


網站名稱:Golang中Unicode與UTF-8有什么區別
本文鏈接:http://www.xueling.net.cn/article/pjoshh.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 久久精品久久精品亚洲人 | 精品伦一区二区三区免费视频 | 免费观看日韩毛片 | 亚洲精品无码专区久久 | 91久久精品国产91久久性色也 | 天天躁夜夜躁狠狠久久 | 人妻丝袜无码专区视频网站 | 国产精品中文字幕在线观看 | 成人水多啪啪片 | 国产真实乱在线更新 | 免费观看激色视频网站在线观看 | 我要一级毛片 | 亚洲一级不卡 | 加山夏子av | 91在现看| 在线一区二区三区 | 美丽的熟妇中文字幕 | 国产日韩亚洲 | gogogo高清免费观看中国 | 亚洲国产精品无码中文字2022 | 出租屋勾搭老熟妇啪啪 | 欧美视频亚洲色图 | 亚洲二区不卡 | 久久频这里精品99香蕉 | 午夜成人精品福利网站在线观看 | 日韩av第一页 | 一级大片在线 | 精品亚洲二区夜色 | 97精品久久久久中文字幕 | 欧美色就插 | 调教一区 | 91先生在线?看 | 国产精华AV午夜在线观看 | 亚洲黄色免费网站 | 日本一区二区国产 | 亚洲中文久久精品无码软件 | 把腿张开抹春药调教男男 | 欧美黄视频网站 | 3D动漫同人精品无码专区 | 国内国内在线自偷第68页 | 国精产品一区二区 |