這篇文章主要講解了“Go語言中多字節(jié)字符怎么處理”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go語言中多字節(jié)字符怎么處理”吧!
創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、服務(wù)器托管德陽解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、購物商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球成百上千家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。1 概述
Go語言的字符串是使用 UTF-8 編碼的。UTF-8 是 Unicode 的實(shí)現(xiàn)方式之一。
2 UTF-8 和 Unicode 的關(guān)系
Unicode一種字符集,是國(guó)際標(biāo)誰化組織(ISO)設(shè)計(jì)的一個(gè)包括了地球上所有文化、所有字母和符號(hào) 的編碼。他們叫它 Universal Multiple-Octet Coded Character Set,簡(jiǎn)稱 UCS,也就是 Unicode。Unicode 為每一個(gè) 字符 分配一個(gè)的 碼點(diǎn)(Code Point),就是一個(gè)的值。例如 康 的碼點(diǎn)就是 24247,十六進(jìn)制為 5eb7。
Unicode 字符集僅僅定義了字符與碼點(diǎn)的對(duì)應(yīng)關(guān)系,但是并沒有定義該如何編碼(存儲(chǔ))這個(gè)碼值,這就導(dǎo)致了很多問題。例如由于字符的碼值不同,導(dǎo)致所需要的存儲(chǔ)空間是不一致的,計(jì)算機(jī)不能確定接下來的字符是占用幾個(gè)字節(jié)。還有就是如果采用固定的長(zhǎng)度假設(shè)都是4個(gè)字節(jié)來存儲(chǔ)碼點(diǎn)值,那么會(huì)導(dǎo)致空間的額外浪費(fèi),因?yàn)?ascii 碼字符其實(shí)僅僅需要一個(gè)字節(jié)的空間。
UTF-8 就是解決如何為 Unicode 編碼而設(shè)計(jì)的一種編碼規(guī)則。可以說 UTF-8 是 Unicode 的實(shí)現(xiàn)方式之一。其特點(diǎn)是一種變長(zhǎng)編碼,使用1到4個(gè)字節(jié)表示一個(gè)字符,根據(jù)不同的符號(hào)而變化長(zhǎng)度。UTF-8 的編碼規(guī)則有二:
對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的 Unicode 碼。因此對(duì)于ASCII碼字符,UTF-8 編碼和 ASCII 碼是相同的。
對(duì)于 n 字節(jié)的符號(hào)(n > 1,2到4),第一個(gè)字節(jié)的前n位都設(shè)為1,第n + 1 位設(shè)為 0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的 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語言中,對(duì)于 Unicode 和 UTF-8 使用了 unicode 和 unicode/utf8 包來實(shí)現(xiàn),下面是閱讀 API 的總結(jié)和說明。
3 Unicode 包
Go語言中,提供了 Unicode 包,處理與 Unicode 相關(guān)的操作,整理如下:
Is(rangeTab *RangeTable, r rune) bool
檢測(cè) rune r 是否在 rangeTable 指定的字符范圍內(nèi)。
rangeTable 一個(gè) Unicode 碼值集合,通常使用 unicode 包中定義的集合。
判斷字符是否出現(xiàn)在漢字集合中:
unicode.Is(unicode.Scripts["Han"], 'k') // 返回 false unicode.Is(unicode.Scripts["Han"], '康') // 返回 true
In(r rune, ranges …*RangeTable) bool
檢測(cè) rune r 是否在多個(gè) rangeTable 指定的字符范圍內(nèi)。
rangeTable 一個(gè) Unicode 碼值集合,通常使用 unicode 包中定義的集合。
unicode.In('康', unicode.Scripts["Han"], unicode.Scripts["Latin"]) // 返回 true unicode.In('k', unicode.Scripts["Han"], unicode.Scripts["Latin"]) // 返回 true
IsOneOf(ranges []*RangeTable, r rune) bool
檢測(cè) rune r 是否在 rangeTable ranges 指定的字符范圍內(nèi)。與 In 功能類似,推薦使用 In。
IsSpace(r rune) bool
檢測(cè)字符 rune r 是否是空白字符。在Latin-1字符空間中,空白字符為:
'\t', '\n', '\v', '\f', '\r', ' ', U+0085 (NEL), U+00A0 (NBSP)
其它的空白字符請(qǐng)參見策略Z和屬性Pattern_White_Space。
IsDigit(r rune) bool
檢測(cè)字符 rune r 是否是十進(jìn)制數(shù)字字符。
unicode.IsDigit('9') // 返回 true unicode.IsDigit('k') // 返回 false
IsNumber(r rune) bool
檢測(cè)字符 rune r 是否是 Unicode 數(shù)字字符。
IsLetter(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是字母
unicode.IsLetter('9') // 返回 false unicode.IsLetter('k') // 返回 true
IsGraphic(r rune) bool
一個(gè)字符 rune r 是否是 unicode 圖形字符。圖形字符包括字母、標(biāo)記、數(shù)字、符號(hào)、標(biāo)點(diǎn)、空白。
unicode.IsGraphic('9') // 返回 true unicode.IsGraphic(',') // 返回 true
IsControl(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是 unicode 控制字符。
IsMark(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是標(biāo)記字符。
IsPrint(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是的可打印字符,基本與圖形字符一致,除ASCII空白字符U+0020。
IsPunct(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是 unicode標(biāo)點(diǎn)字符。
unicode.IsPunct('9') // 返回 false unicode.IsPunct(',') // 返回 true
IsSymbol(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是 unicode 符號(hào)字符。
IsLower(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是小寫字母。
unicode.IsLower('h') // 返回 true unicode.IsLower('H') // 返回 false
IsUpper(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是大寫字母。
unicode.IsUpper('h') // 返回 false unicode.IsUpper('H') // 返回 true
IsTitle(r rune) bool
檢測(cè)一個(gè)字符 rune r 是否是Title字符。大部分字符的 Title 格式就是其大寫格式,少數(shù)字符的 Title 格式是特殊字符,例如 ???。
unicode.IsTitle('?') // 返回 true unicode.IsTitle('h') // 返回 false unicode.IsTitle('H') // 返回 true
To(_case int, r rune) rune
將字符 rune r 轉(zhuǎn)換為指定的格式,格式_case支持:unicode.UpperCase、unicode.LowerCase、unicode.TitleCase
unicode.To(unicode.UpperCase, 'h') // 返回 H
ToLower(r rune) rune
將字符 rune r 轉(zhuǎn)換為小寫。
unicode.ToLower('H') // 返回 h
func (SpecialCase) ToLower
將字符 rune r 轉(zhuǎn)換為小寫。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應(yīng)用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToLower('?') // 返回 i
ToUpper(r rune) rune
將字符 rune r 轉(zhuǎn)換為大寫。
unicode.ToUpper('h') // 返回 H
func (SpecialCase) ToUpper
將字符 rune r 轉(zhuǎn)換為大寫。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應(yīng)用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToUpper('i') // 返回 ?
ToTitle(r rune) rune
將字符 rune r 轉(zhuǎn)換為 Title 字符。
unicode.ToTitle('h') // 返回 H
func (SpecialCase) ToTitle
將字符 rune r 轉(zhuǎn)換為 Title 字符。優(yōu)先使用映射表 SpecialCase。
映射表 SpecialCase 是特定語言環(huán)境下大小寫的映射表。主要應(yīng)用于一些歐洲字符,例如土耳其 TurkishCase。
unicode.TurkishCase.ToTitle('i') // 返回 ?
SimpleFold(r rune) rune
在 unicode 標(biāo)準(zhǔn)字符映射中查找與 rune r 互相對(duì)應(yīng)的 unicode 碼值。向碼值大的方向循環(huán)查找?;ハ鄬?duì)應(yīng)指的是同一個(gè)字符可能出現(xiàn)的多種寫法。
unicode.SimpleFold('H') // 返回 h unicode.SimpleFold('Φ')) // 返回 φ
4 unicode/utf8 包
DecodeLastRune(p []byte) (r rune, size int)
解碼 []byte p 中最后一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。
utf8.DecodeLastRune([]byte("小韓說課")) // 返回 35838 3 // 35838 就是課的 unicode 碼值
DecodeLastRuneInString(s string) (r rune, size int)
解碼 string s 中最后一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。
utf8.DecodeLastRuneInString("小韓說課") // 返回 35838 3 // 35838 就是課的 unicode 碼值
DecodeRune(p []byte) (r rune, size int)
解碼 []byte p 中第一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。
utf8.DecodeRune([]byte("小韓說課")) // 返回 23567 3 // 23567 就是 小 的 unicode 碼值
DecodeRuneInString(s string) (r rune, size int)
解碼 string s 中第一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。
utf8.DecodeRuneInString("小韓說課") // 返回 23567 3 // 23567 就是 小 的 unicode 碼值
EncodeRune(p []byte, r rune) int
將 rune r 的 UTF-8 編碼序列寫入 []byte p,并返回寫入的字節(jié)數(shù)。p 滿足足夠的長(zhǎng)度。
buf := make([]byte, 3) n := utf8.EncodeRune(buf, '康') fmt.Println(buf, n) // 輸出 [229 186 183] 3
FullRune(p []byte) bool
檢測(cè) []byte p 是否包含一個(gè)完整 UTF-8 編碼。
buf := []byte{229, 186, 183} // 康 utf8.FullRune(buf) // 返回 true utf8.FullRune(buf[:2]) // 返回 false
FullRuneInString(s string) bool
檢測(cè) string s 是否包含一個(gè)完整 UTF-8 編碼。
buf := "康" // 康 utf8.FullRuneInString(buf) // 返回 true utf8.FullRuneInString(buf[:2]) // 返回 false
RuneCount(p []byte) int
返回 []byte p 中的 UTF-8 編碼的碼值的個(gè)數(shù)。
buf := []byte("小韓說課") len(buf) // 返回 12 utf8.RuneCount(buf) // 返回 4
RuneCountInString(s string) (n int)
返回 string s 中的 UTF-8 編碼的碼值的個(gè)數(shù)。
buf := "小韓說課" len(buf) // 返回 12 utf8.RuneCountInString(buf) // 返回 4
RuneLen(r rune) int
返回 rune r 編碼后的字節(jié)數(shù)。
utf8.RuneLen('康') // 返回 3 utf8.RuneLen('H') // 返回 1
RuneStart(b byte) bool
檢測(cè)字節(jié) byte b 是否可以作為某個(gè) rune 編碼的第一個(gè)字節(jié)。
buf := "小韓說課" utf8.RuneStart(buf[0]) // 返回 true utf8.RuneStart(buf[1]) // 返回 false utf8.RuneStart(buf[3]) // 返回 true
Valid(p []byte) bool
檢測(cè)切片 []byte p 是否包含完整且合法的 UTF-8 編碼序列。
valid := []byte("小韓說課") invalid := []byte{0xff, 0xfe, 0xfd} utf8.Valid(valid) // 返回 true utf8.Valid(invalid) // 返回 false
ValidRune(r rune) bool
檢測(cè)字符 rune r 是否包含完整且合法的 UTF-8 編碼序列。
valid := 'a' invalid := rune(0xfffffff) fmt.Println(utf8.ValidRune(valid)) // 返回 true fmt.Println(utf8.ValidRune(invalid)) // 返回 false
ValidString(s string) bool
檢測(cè)字符串 string s 是否包含完整且合法的 UTF-8 編碼序列。
valid := "小韓說課" invalid := string([]byte{0xff, 0xfe, 0xfd}) fmt.Println(utf8.ValidString(valid)) // 返回 true fmt.Println(utf8.ValidString(invalid)) // 返回 false
感謝各位的閱讀,以上就是“Go語言中多字節(jié)字符怎么處理”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Go語言中多字節(jié)字符怎么處理這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享文章:Go語言中多字節(jié)字符怎么處理-創(chuàng)新互聯(lián)
鏈接分享:http://jinyejixie.com/article20/ggijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、建站公司、網(wǎng)站制作、Google、移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容