Go語言的字符串是使用UTF-8
編碼的。UTF-8
是Unicode
的實現方式之一。本文內容包括:UTF-8
和Unicode
的關系,Go語言提供的unicode
包和unicode/utf8
包的使用。
UTF-8
和Unicode
的關系Unicode
一種字符集,是國際標誰化組織(ISO)設計的一個包括了地球上所有文化、所有字母和符號 的編碼。他們叫它Universal Multiple-Octet Coded Character Set
,簡稱 UCS,也就是Unicode
。Unicode
為每一個 字符 分配一個唯一的 碼點(Code Point),就是一個唯一的值。例如 康 的碼點就是 24247,十六進制為5eb7
。Unicode
字符集僅僅定義了字符與碼點的對應關系,但是并沒有定義該如何編碼(存儲)這個碼值,這就導致了很多問題。例如由于字符的碼值不同,導致所需要的存儲空間是不一致的,計算機不能確定接下來的字符是占用幾個字節(jié)。還有就是如果采用固定的長度假設都是4個字節(jié)來存儲碼點值,那么會導致空間的額外浪費,因為ascii
碼字符其實僅僅需要一個字節(jié)的空間。
UTF-8
就是解決如何為Unicode
編碼而設計的一種編碼規(guī)則。可以說UTF-8
是Unicode
的實現方式之一。其特點是一種變長編碼,使用1到4個字節(jié)表示一個字符,根據不同的符號而變化長度。UTF-8
的編碼規(guī)則有二:
Unicode
碼。因此對于ASCII碼字符,UTF-8
編碼和ASCII
碼是相同的。Unicode
碼。以下是編碼規(guī)則:
Unicode | UTF-8
---------------------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
---------------------------------------------------------
Go語言中,對于 Unicode 和 UTF-8 使用了unicode
和unicode/utf8
包來實現,下面是閱讀 API 的總結和說明。
Unicode
包Go語言中,提供了Unicode
包,處理與Unicode
相關的操作,整理如下:
檢測 rune r 是否在rangeTable
指定的字符范圍內。rangeTable
一個Unicode
碼值集合,通常使用unicode
包中定義的集合。
判斷字符是否出現在漢字集合中:
unicode.Is(unicode.Scripts["Han"], 'k')
// 返回 false
unicode.Is(unicode.Scripts["Han"], '康')
// 返回 true
檢測 rune r 是否在多個rangeTable
指定的字符范圍內。rangeTable
一個Unicode
碼值集合,通常使用unicode
包中定義的集合。
unicode.In('康', unicode.Scripts["Han"], unicode.Scripts["Latin"])
// 返回 true
unicode.In('k', unicode.Scripts["Han"], unicode.Scripts["Latin"])
// 返回 true
檢測 rune r 是否在rangeTable
ranges 指定的字符范圍內。與In
功能類似,推薦使用In
。
檢測字符 rune r 是否是空白字符。在Latin-1字符空間中,空白字符為:
'\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP)
其它的空白字符請參見策略Z和屬性Pattern_White_Space。
檢測字符 rune r 是否是十進制數字字符。
unicode.IsDigit('9')
// 返回 true
unicode.IsDigit('k')
// 返回 false
檢測字符 rune r 是否是Unicode
數字字符。
檢測一個字符 rune r 是否是字母
unicode.IsLetter('9')
// 返回 false
unicode.IsLetter('k')
// 返回 true
一個字符 rune r 是否是 unicode 圖形字符。圖形字符包括字母、標記、數字、符號、標點、空白。
unicode.IsGraphic('9')
// 返回 true
unicode.IsGraphic(',')
// 返回 true
檢測一個字符 rune r 是否是 unicode 控制字符。
檢測一個字符 rune r 是否是標記字符。
檢測一個字符 rune r 是否是的可打印字符,基本與圖形字符一致,除ASCII空白字符U+0020。
檢測一個字符 rune r 是否是 unicode標點字符。
unicode.IsPunct('9')
// 返回 false
unicode.IsPunct(',')
// 返回 true
檢測一個字符 rune r 是否是 unicode 符號字符。
檢測一個字符 rune r 是否是小寫字母。
unicode.IsLower('h')
// 返回 true
unicode.IsLower('H')
// 返回 false
檢測一個字符 rune r 是否是大寫字母。
unicode.IsUpper('h')
// 返回 false
unicode.IsUpper('H')
// 返回 true
檢測一個字符 rune r 是否是Title字符。大部分字符的 Title 格式就是其大寫格式,少數字符的 Title 格式是特殊字符,例如???
。
unicode.IsTitle('?')
// 返回 true
unicode.IsTitle('h')
// 返回 false
unicode.IsTitle('H')
// 返回 true
將字符 rune r 轉換為指定的格式,格式_case支持:unicode.UpperCase、unicode.LowerCase、unicode.TitleCase
unicode.To(unicode.UpperCase, 'h')
// 返回 H
將字符 rune r 轉換為小寫。
unicode.ToLower('H')
// 返回 h
將字符 rune r 轉換為小寫。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToLower('?')
// 返回 i
將字符 rune r 轉換為大寫。
unicode.ToUpper('h')
// 返回 H
將字符 rune r 轉換為大寫。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToUpper('i')
// 返回 ?
將字符 rune r 轉換為 Title 字符。
unicode.ToTitle('h')
// 返回 H
將字符 rune r 轉換為 Title 字符。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToTitle('i')
// 返回 ?
在 unicode 標準字符映射中查找與 rune r 互相對應的 unicode 碼值。向碼值大的方向循環(huán)查找。互相對應指的是同一個字符可能出現的多種寫法。
unicode.SimpleFold('H')
// 返回 h
unicode.SimpleFold('Φ'))
// 返回 φ
unicode/utf8
包解碼 []byte p 中最后一個 UTF-8 編碼序列,返回該碼值和長度。
utf8.DecodeLastRune([]byte("小韓說課"))
// 返回 35838 3
// 35838 就是課的 unicode 碼值
解碼 string s 中最后一個 UTF-8 編碼序列,返回該碼值和長度。
utf8.DecodeLastRuneInString("小韓說課")
// 返回 35838 3
// 35838 就是課的 unicode 碼值
解碼 []byte p 中第一個 UTF-8 編碼序列,返回該碼值和長度。
utf8.DecodeRune([]byte("小韓說課"))
// 返回 23567 3
// 23567 就是 小 的 unicode 碼值
解碼 string s 中第一個 UTF-8 編碼序列,返回該碼值和長度。
utf8.DecodeRuneInString("小韓說課")
// 返回 23567 3
// 23567 就是 小 的 unicode 碼值
將 rune r 的 UTF-8 編碼序列寫入 []byte p,并返回寫入的字節(jié)數。p 滿足足夠的長度。
buf := make([]byte, 3)
n := utf8.EncodeRune(buf, '康')
fmt.Println(buf, n)
// 輸出 [229 186 183] 3
檢測 []byte p 是否包含一個完整 UTF-8 編碼。
buf := []byte{229, 186, 183} // 康
utf8.FullRune(buf)
// 返回 true
utf8.FullRune(buf[:2])
// 返回 false
檢測 string s 是否包含一個完整 UTF-8 編碼。
buf := "康" // 康
utf8.FullRuneInString(buf)
// 返回 true
utf8.FullRuneInString(buf[:2])
// 返回 false
返回 []byte p 中的 UTF-8 編碼的碼值的個數。
buf := []byte("小韓說課")
len(buf)
// 返回 12
utf8.RuneCount(buf)
// 返回 4
返回 string s 中的 UTF-8 編碼的碼值的個數。
buf := "小韓說課"
len(buf)
// 返回 12
utf8.RuneCountInString(buf)
// 返回 4
返回 rune r 編碼后的字節(jié)數。
utf8.RuneLen('康')
// 返回 3
utf8.RuneLen('H')
// 返回 1
檢測字節(jié) byte b 是否可以作為某個 rune 編碼的第一個字節(jié)。
buf := "小韓說課"
utf8.RuneStart(buf[0])
// 返回 true
utf8.RuneStart(buf[1])
// 返回 false
utf8.RuneStart(buf[3])
// 返回 true
檢測切片 []byte p 是否包含完整且合法的 UTF-8 編碼序列。
valid := []byte("小韓說課")
invalid := []byte{0xff, 0xfe, 0xfd}
utf8.Valid(valid)
// 返回 true
utf8.Valid(invalid)
// 返回 false
檢測字符 rune r 是否包含完整且合法的 UTF-8 編碼序列。
valid := 'a'
invalid := rune(0xfffffff)
fmt.Println(utf8.ValidRune(valid))
// 返回 true
fmt.Println(utf8.ValidRune(invalid))
// 返回 false
檢測字符串 string s 是否包含完整且合法的 UTF-8 編碼序列。
valid := "小韓說課"
invalid := string([]byte{0xff, 0xfe, 0xfd})
fmt.Println(utf8.ValidString(valid))
// 返回 true
fmt.Println(utf8.ValidString(invalid))
// 返回 false
完!
原文出自:小韓說課
微信關注:小韓說課
創(chuàng)新互聯www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現已開啟,新人活動云服務器買多久送多久。
網站名稱:Go語言中多字節(jié)字符的處理-創(chuàng)新互聯
URL網址:http://www.rwnh.cn/article34/cehcse.html
成都網站建設公司_創(chuàng)新互聯,為您提供定制開發(fā)、建站公司、Google、微信小程序、軟件開發(fā)、網站營銷
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯