亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言中多字節字符的處理方法詳解

2020-04-01 18:51:30
字體:
來源:轉載
供稿:網友

1 概述

Go語言的字符串是使用 UTF-8 編碼的。UTF-8 是 Unicode 的實現方式之一。本文內容包括:UTF-8 和 Unicode 的關系,Go語言提供的 unicode 包和 unicode/utf8 包的使用。

下面話不多說了,來一起看看詳細的介紹吧

2 UTF-8 和 Unicode 的關系

Unicode一種字符集,是國際標誰化組織(ISO)設計的一個包括了地球上所有文化、所有字母和符號 的編碼。他們叫它 Universal Multiple-Octet Coded Character Set,簡稱 UCS,也就是 Unicode。Unicode 為每一個 字符 分配一個唯一的 碼點(Code Point),就是一個唯一的值。例如 康 的碼點就是 24247,十六進制為 5eb7。

Unicode 字符集僅僅定義了字符與碼點的對應關系,但是并沒有定義該如何編碼(存儲)這個碼值,這就導致了很多問題。例如由于字符的碼值不同,導致所需要的存儲空間是不一致的,計算機不能確定接下來的字符是占用幾個字節。還有就是如果采用固定的長度假設都是4個字節來存儲碼點值,那么會導致空間的額外浪費,因為 ascii 碼字符其實僅僅需要一個字節的空間。

UTF-8 就是解決如何為 Unicode 編碼而設計的一種編碼規則??梢哉f UTF-8 是 Unicode 的實現方式之一。其特點是一種變長編碼,使用1到4個字節表示一個字符,根據不同的符號而變化長度。UTF-8 的編碼規則有二:

  • 對于單字節的符號,字節的第一位設為0,后面7位為這個符號的 Unicode 碼。因此對于ASCII碼字符,UTF-8 編碼和 ASCII 碼是相同的。
  • 對于 n 字節的符號(n > 1,2到4),第一個字節的前n位都設為1,第n + 1 位設為 0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼。

以下是編碼規則:

Unicode    | UTF-8--------------------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx---------------------------------------------------------

Go語言中,對于 Unicode 和 UTF-8 使用了 unicode 和 unicode/utf8 包來實現,下面是閱讀 API 的總結和說明。

3 Unicode 包

Go語言中,提供了 Unicode 包,處理與 Unicode 相關的操作,整理如下:

Is(rangeTab *RangeTable, r rune) bool

檢測 rune r 是否在 rangeTable 指定的字符范圍內。

rangeTable 一個 Unicode 碼值集合,通常使用 unicode 包中定義的集合。

判斷字符是否出現在漢字集合中:

unicode.Is(unicode.Scripts["Han"], 'k')// 返回 falseunicode.Is(unicode.Scripts["Han"], '康')// 返回 true

In(r rune, ranges …*RangeTable) bool

檢測 rune r 是否在多個 rangeTable 指定的字符范圍內。

rangeTable 一個 Unicode 碼值集合,通常使用 unicode 包中定義的集合。

unicode.In('康', unicode.Scripts["Han"], unicode.Scripts["Latin"])// 返回 trueunicode.In('k', unicode.Scripts["Han"], unicode.Scripts["Latin"])// 返回 true

IsOneOf(ranges []*RangeTable, r rune) bool

檢測 rune r 是否在 rangeTable ranges 指定的字符范圍內。與 In 功能類似,推薦使用 In。

IsSpace(r rune) bool

檢測字符 rune r 是否是空白字符。在Latin-1字符空間中,空白字符為:

'/t', '/n', '/v', '/f', '/r', ' ', U+0085 (NEL), U+00A0 (NBSP)

其它的空白字符請參見策略Z和屬性Pattern_White_Space。

IsDigit(r rune) bool

檢測字符 rune r 是否是十進制數字字符。

unicode.IsDigit('9')// 返回 trueunicode.IsDigit('k')// 返回 false

IsNumber(r rune) bool

檢測字符 rune r 是否是 Unicode 數字字符。

IsLetter(r rune) bool

檢測一個字符 rune r 是否是字母

unicode.IsLetter('9')// 返回 falseunicode.IsLetter('k')// 返回 true

IsGraphic(r rune) bool

一個字符 rune r 是否是 unicode 圖形字符。圖形字符包括字母、標記、數字、符號、標點、空白。

unicode.IsGraphic('9')// 返回 trueunicode.IsGraphic(',')// 返回 true

IsControl(r rune) bool

檢測一個字符 rune r 是否是 unicode 控制字符。

IsMark(r rune) bool

檢測一個字符 rune r 是否是標記字符。

IsPrint(r rune) bool

檢測一個字符 rune r 是否是的可打印字符,基本與圖形字符一致,除ASCII空白字符U+0020。

IsPunct(r rune) bool

檢測一個字符 rune r 是否是 unicode標點字符。

unicode.IsPunct('9')// 返回 falseunicode.IsPunct(',')// 返回 true

IsSymbol(r rune) bool

檢測一個字符 rune r 是否是 unicode 符號字符。

IsLower(r rune) bool

檢測一個字符 rune r 是否是小寫字母。

unicode.IsLower('h')// 返回 trueunicode.IsLower('H')// 返回 false

IsUpper(r rune) bool

檢測一個字符 rune r 是否是大寫字母。

unicode.IsUpper('h')// 返回 falseunicode.IsUpper('H')// 返回 true

IsTitle(r rune) bool

檢測一個字符 rune r 是否是Title字符。大部分字符的 Title 格式就是其大寫格式,少數字符的 Title 格式是特殊字符,例如 ???。

unicode.IsTitle('?')// 返回 trueunicode.IsTitle('h')// 返回 falseunicode.IsTitle('H')// 返回 true

To(_case int, r rune) rune

將字符 rune r 轉換為指定的格式,格式_case支持:unicode.UpperCase、unicode.LowerCase、unicode.TitleCase

unicode.To(unicode.UpperCase, 'h')// 返回 H

ToLower(r rune) rune

將字符 rune r 轉換為小寫。

unicode.ToLower('H')// 返回 h

func (SpecialCase) ToLower

將字符 rune r 轉換為小寫。優先使用映射表 SpecialCase。

映射表 SpecialCase 是特定語言環境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。

unicode.TurkishCase.ToLower('?')// 返回 i

ToUpper(r rune) rune

將字符 rune r 轉換為大寫。

unicode.ToUpper('h')// 返回 H

func (SpecialCase) ToUpper

將字符 rune r 轉換為大寫。優先使用映射表 SpecialCase。

映射表 SpecialCase 是特定語言環境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。

unicode.TurkishCase.ToUpper('i')// 返回 ?

ToTitle(r rune) rune

將字符 rune r 轉換為 Title 字符。

unicode.ToTitle('h')// 返回 H

func (SpecialCase) ToTitle

將字符 rune r 轉換為 Title 字符。優先使用映射表 SpecialCase。

映射表 SpecialCase 是特定語言環境下大小寫的映射表。主要應用于一些歐洲字符,例如土耳其 TurkishCase。

unicode.TurkishCase.ToTitle('i')// 返回 ?

SimpleFold(r rune) rune

在 unicode 標準字符映射中查找與 rune r 互相對應的 unicode 碼值。向碼值大的方向循環查找?;ハ鄬傅氖峭粋€字符可能出現的多種寫法。

unicode.SimpleFold('H')// 返回 hunicode.SimpleFold('Φ')) // 返回 φ

4 unicode/utf8 包

DecodeLastRune(p []byte) (r rune, size int)

解碼 []byte p 中最后一個 UTF-8 編碼序列,返回該碼值和長度。

utf8.DecodeLastRune([]byte("小韓說課"))// 返回 35838 3// 35838 就是課的 unicode 碼值

DecodeLastRuneInString(s string) (r rune, size int)

解碼 string s 中最后一個 UTF-8 編碼序列,返回該碼值和長度。

utf8.DecodeLastRuneInString("小韓說課")// 返回 35838 3// 35838 就是課的 unicode 碼值

DecodeRune(p []byte) (r rune, size int)

解碼 []byte p 中第一個 UTF-8 編碼序列,返回該碼值和長度。

utf8.DecodeRune([]byte("小韓說課"))// 返回 23567 3// 23567 就是 小 的 unicode 碼值

DecodeRuneInString(s string) (r rune, size int)

解碼 string s 中第一個 UTF-8 編碼序列,返回該碼值和長度。

utf8.DecodeRuneInString("小韓說課")// 返回 23567 3// 23567 就是 小 的 unicode 碼值

EncodeRune(p []byte, r rune) int

將 rune r 的 UTF-8 編碼序列寫入 []byte p,并返回寫入的字節數。p 滿足足夠的長度。

buf := make([]byte, 3)n := utf8.EncodeRune(buf, '康')fmt.Println(buf, n)// 輸出 [229 186 183] 3

FullRune(p []byte) bool

檢測 []byte p 是否包含一個完整 UTF-8 編碼。

buf := []byte{229, 186, 183} // 康utf8.FullRune(buf)// 返回 trueutf8.FullRune(buf[:2])// 返回 false

FullRuneInString(s string) bool

檢測 string s 是否包含一個完整 UTF-8 編碼。

buf := "康" // 康utf8.FullRuneInString(buf)// 返回 trueutf8.FullRuneInString(buf[:2])// 返回 false

RuneCount(p []byte) int

返回 []byte p 中的 UTF-8 編碼的碼值的個數。

buf := []byte("小韓說課")len(buf)// 返回 12utf8.RuneCount(buf)// 返回 4

RuneCountInString(s string) (n int)

返回 string s 中的 UTF-8 編碼的碼值的個數。

buf := "小韓說課"len(buf)// 返回 12utf8.RuneCountInString(buf)// 返回 4

RuneLen(r rune) int

返回 rune r 編碼后的字節數。

utf8.RuneLen('康')// 返回 3utf8.RuneLen('H')// 返回 1

RuneStart(b byte) bool

檢測字節 byte b 是否可以作為某個 rune 編碼的第一個字節。

buf := "小韓說課"utf8.RuneStart(buf[0])// 返回 trueutf8.RuneStart(buf[1])// 返回 falseutf8.RuneStart(buf[3])// 返回 true

Valid(p []byte) bool

檢測切片 []byte p 是否包含完整且合法的 UTF-8 編碼序列。

valid := []byte("小韓說課")invalid := []byte{0xff, 0xfe, 0xfd}utf8.Valid(valid)// 返回 trueutf8.Valid(invalid)// 返回 false

ValidRune(r rune) bool

檢測字符 rune r 是否包含完整且合法的 UTF-8 編碼序列。

valid := 'a'invalid := rune(0xfffffff)fmt.Println(utf8.ValidRune(valid))// 返回 truefmt.Println(utf8.ValidRune(invalid))// 返回 false

ValidString(s string) bool

檢測字符串 string s 是否包含完整且合法的 UTF-8 編碼序列。

valid := "小韓說課"invalid := string([]byte{0xff, 0xfe, 0xfd})fmt.Println(utf8.ValidString(valid))// 返回 truefmt.Println(utf8.ValidString(invalid))// 返回 false

完!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产96久久久香蕉| 久久久精品美女| 国产91成人video| 国产精品第2页| 色妞欧美日韩在线| 丝袜亚洲欧美日韩综合| 亚洲娇小xxxx欧美娇小| 国产精品视频一区二区高潮| 成人黄在线观看| 亚洲天堂男人的天堂| 欧美床上激情在线观看| 国产做受69高潮| 日韩欧美成人精品| 国产精品国语对白| 九九视频这里只有精品| 久久久久久久久电影| 欧美高清性猛交| 青草热久免费精品视频| 国模视频一区二区| 2019av中文字幕| 亚洲的天堂在线中文字幕| 日本欧美一二三区| 国自在线精品视频| 日本久久中文字幕| 91九色视频导航| 亚洲精品第一国产综合精品| 韩剧1988在线观看免费完整版| 国产精品久久久久91| 国产成人jvid在线播放| 国产精品美女在线| 欧美日产国产成人免费图片| 97国产精品人人爽人人做| 国产精品av电影| 91色琪琪电影亚洲精品久久| 亚洲视频777| 亚洲性av在线| 中文字幕一区二区精品| 国产午夜精品理论片a级探花| 亚洲丁香久久久| 精品国产31久久久久久| 在线视频一区二区| 亚洲欧洲第一视频| 美女国内精品自产拍在线播放| 91av在线免费观看| 91人人爽人人爽人人精88v| 国产欧美精品一区二区三区-老狼| 精品亚洲一区二区三区四区五区| 91精品视频在线看| 亚洲电影免费在线观看| 一区二区三区视频免费在线观看| 日韩在线观看成人| 97视频在线观看视频免费视频| 国产亚洲精品久久久久久牛牛| 亚洲一区二区三区久久| 日韩欧美综合在线视频| 2019精品视频| 亚洲天堂av高清| 日韩欧美国产激情| 国产午夜精品免费一区二区三区| 欧美激情免费看| 欧美又大又粗又长| 欧美xxxx14xxxxx性爽| 91av在线看| 免费91在线视频| 欧美日韩午夜视频在线观看| 欧美激情一区二区三区久久久| 中文字幕成人精品久久不卡| 国产裸体写真av一区二区| 久久久久久久香蕉网| 国产精品第1页| 亚洲最新av在线| 欧美成人在线影院| 5252色成人免费视频| 日韩精品欧美国产精品忘忧草| 26uuu另类亚洲欧美日本老年| 亚洲欧美另类中文字幕| 欧美丝袜一区二区| 少妇高潮久久久久久潘金莲| 欧美在线欧美在线| 久久久久久久久爱| 中文字幕不卡av| 韩国三级日本三级少妇99| 在线性视频日韩欧美| 国产裸体写真av一区二区| 亚洲毛片在线观看.| 色偷偷av一区二区三区| 欧美日韩亚洲一区二区三区| 亚洲第一免费播放区| 久久久久久18| 久久久久久久电影一区| 亚洲精品xxxx| 亚洲人成网在线播放| 2021久久精品国产99国产精品| 色偷偷综合社区| 久久99久久久久久久噜噜| 国产精品美乳在线观看| 日韩亚洲在线观看| 97久久国产精品| 日本sm极度另类视频| 欧美大片在线看免费观看| 国内精品小视频在线观看| 国产成人精品视频| 亚洲人线精品午夜| 欧美日韩国内自拍| 青草青草久热精品视频在线网站| 在线视频欧美性高潮| 最近2019中文字幕一页二页| 久久久国产精品免费| 欧美日韩国产丝袜美女| 超碰日本道色综合久久综合| 日本精品一区二区三区在线播放视频| 黑人欧美xxxx| 精品成人69xx.xyz| 欧美激情网友自拍| 亚洲最大成人网色| 久久网福利资源网站| 在线看日韩av| 91成人在线播放| 欧美色欧美亚洲高清在线视频| 国产啪精品视频| 一区二区三区视频免费| 亚洲成人激情在线观看| 日本精品一区二区三区在线| 热re91久久精品国99热蜜臀| 日韩精品亚洲元码| 精品一区二区亚洲| 国产精品久久久久久av福利| 日韩视频免费观看| 91精品国产色综合| 欧美视频在线观看 亚洲欧| 在线成人免费网站| 成人午夜激情免费视频| 91久久嫩草影院一区二区| 亚洲变态欧美另类捆绑| 亚洲天堂网站在线观看视频| 国产综合久久久久| 九九热99久久久国产盗摄| 日韩人体视频一二区| 久久久亚洲精选| 日韩在线精品视频| 日韩禁在线播放| 日本久久亚洲电影| 91色琪琪电影亚洲精品久久| 97精品一区二区视频在线观看| 成人女保姆的销魂服务| 亚洲电影免费观看高清| 中文字幕日韩精品在线观看| 26uuu日韩精品一区二区| 欧美精品18videos性欧| 亚洲精品suv精品一区二区| 国产欧美精品xxxx另类| 亚洲人成网站999久久久综合| 九色成人免费视频| 成人av在线天堂| 亚洲国产日韩欧美在线图片| 欧美精品精品精品精品免费| 亚洲石原莉奈一区二区在线观看| 中文亚洲视频在线| 青青草成人在线| 日韩av一区在线观看| 国产精品久久久久久av福利| 国产丝袜一区二区三区免费视频| 97色在线观看| 欧美激情一区二区三级高清视频|