校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁(yè) > 知識(shí)庫(kù) > Go語(yǔ)言中多字節(jié)字符的處理方法詳解

Go語(yǔ)言中多字節(jié)字符的處理方法詳解

熱門(mén)標(biāo)簽:江西轉(zhuǎn)化率高的羿智云外呼系統(tǒng) 西部云谷一期地圖標(biāo)注 南通如皋申請(qǐng)開(kāi)通400電話 廣州呼叫中心外呼系統(tǒng) 高德地圖標(biāo)注口訣 中國(guó)地圖標(biāo)注省會(huì)高清 學(xué)海導(dǎo)航地圖標(biāo)注 浙江高速公路地圖標(biāo)注 地圖標(biāo)注的汽車(chē)標(biāo)

1 概述

Go語(yǔ)言的字符串是使用 UTF-8 編碼的。UTF-8 是 Unicode 的實(shí)現(xiàn)方式之一。本文內(nèi)容包括:UTF-8 和 Unicode 的關(guān)系,Go語(yǔ)言提供的 unicode 包和 unicode/utf8 包的使用。

下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

2 UTF-8 和 Unicode 的關(guān)系

Unicode一種字符集,是國(guó)際標(biāo)誰(shuí)化組織(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)系,但是并沒(méi)有定義該如何編碼(存儲(chǔ))這個(gè)碼值,這就導(dǎo)致了很多問(wèn)題。例如由于字符的碼值不同,導(dǎo)致所需要的存儲(chǔ)空間是不一致的,計(jì)算機(jī)不能確定接下來(lái)的字符是占用幾個(gè)字節(jié)。還有就是如果采用固定的長(zhǎng)度假設(shè)都是4個(gè)字節(jié)來(lái)存儲(chǔ)碼點(diǎn)值,那么會(huì)導(dǎo)致空間的額外浪費(fèi),因?yàn)?ascii 碼字符其實(shí)僅僅需要一個(gè)字節(jié)的空間。

UTF-8 就是解決如何為 Unicode 編碼而設(shè)計(jì)的一種編碼規(guī)則。可以說(shuō) 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。剩下的沒(méi)有提及的二進(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語(yǔ)言中,對(duì)于 Unicode 和 UTF-8 使用了 unicode 和 unicode/utf8 包來(lái)實(shí)現(xiàn),下面是閱讀 API 的總結(jié)和說(shuō)明。

3 Unicode 包

Go語(yǔ)言中,提供了 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)參見(jiàn)策略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 是否是小寫(xiě)字母。

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

IsUpper(r rune) bool

檢測(cè)一個(gè)字符 rune r 是否是大寫(xiě)字母。

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

IsTitle(r rune) bool

檢測(cè)一個(gè)字符 rune r 是否是Title字符。大部分字符的 Title 格式就是其大寫(xiě)格式,少數(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)換為小寫(xiě)。

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

func (SpecialCase) ToLower

將字符 rune r 轉(zhuǎn)換為小寫(xiě)。優(yōu)先使用映射表 SpecialCase。

映射表 SpecialCase 是特定語(yǔ)言環(huán)境下大小寫(xiě)的映射表。主要應(yīng)用于一些歐洲字符,例如土耳其 TurkishCase。

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

ToUpper(r rune) rune

將字符 rune r 轉(zhuǎn)換為大寫(xiě)。

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

func (SpecialCase) ToUpper

將字符 rune r 轉(zhuǎn)換為大寫(xiě)。優(yōu)先使用映射表 SpecialCase。

映射表 SpecialCase 是特定語(yǔ)言環(huán)境下大小寫(xiě)的映射表。主要應(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 是特定語(yǔ)言環(huán)境下大小寫(xiě)的映射表。主要應(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)的多種寫(xiě)法。

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("小韓說(shuō)課"))
// 返回 35838 3
// 35838 就是課的 unicode 碼值

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

解碼 string s 中最后一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。

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

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

解碼 []byte p 中第一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。

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

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

解碼 string s 中第一個(gè) UTF-8 編碼序列,返回該碼值和長(zhǎng)度。

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

EncodeRune(p []byte, r rune) int

將 rune r 的 UTF-8 編碼序列寫(xiě)入 []byte p,并返回寫(xiě)入的字節(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("小韓說(shuō)課")
len(buf)
// 返回 12
utf8.RuneCount(buf)
// 返回 4

RuneCountInString(s string) (n int)

返回 string s 中的 UTF-8 編碼的碼值的個(gè)數(shù)。

buf := "小韓說(shuō)課"
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 := "小韓說(shuō)課"
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("小韓說(shuō)課")
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 := "小韓說(shuō)課"
invalid := string([]byte{0xff, 0xfe, 0xfd})
fmt.Println(utf8.ValidString(valid))
// 返回 true
fmt.Println(utf8.ValidString(invalid))
// 返回 false

完!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑
  • Go語(yǔ)言中http和mysql的實(shí)現(xiàn)代碼
  • go語(yǔ)言中int和byte轉(zhuǎn)換方式
  • Go語(yǔ)言中的字符串處理方法示例詳解
  • Go語(yǔ)言實(shí)現(xiàn)互斥鎖、隨機(jī)數(shù)、time、List
  • Go語(yǔ)言中 Channel 詳解
  • go語(yǔ)言中strings包的用法匯總
  • Go語(yǔ)言的JSON處理詳解
  • Go語(yǔ)言的文件操作代碼匯總
  • Golang數(shù)組的傳遞詳解

標(biāo)簽:常州 德宏 東營(yíng) 保定 曲靖 貴州 許昌 吐魯番

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語(yǔ)言中多字節(jié)字符的處理方法詳解》,本文關(guān)鍵詞  語(yǔ),言中,多,字節(jié),字符,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語(yǔ)言中多字節(jié)字符的處理方法詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Go語(yǔ)言中多字節(jié)字符的處理方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    4438x亚洲最大成人网| 午夜欧美大尺度福利影院在线看| 首页欧美精品中文字幕| 成人爽a毛片一区二区免费| 欧美视频三区在线播放| 国产精品素人一区二区| 久久99精品久久久久久动态图| 欧美性一二三区| 日韩一区中文字幕| 色噜噜狠狠成人中文综合| 久久色在线视频| 国产成人精品一区二| 国产日本一区二区| 波多野结衣一区二区三区| 日本不卡视频一二三区| 日韩一区二区免费高清| 久久超级碰视频| 欧美大尺度电影在线| 男女视频一区二区| 久久综合久久综合久久| 国产成人av电影在线| 国产精品女同互慰在线看| 91一区在线观看| 午夜免费欧美电影| 欧美成人国产一区二区| 国产盗摄女厕一区二区三区| 国产精品久久久久影院| 色婷婷久久久亚洲一区二区三区 | 欧美日韩成人激情| 日韩经典一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 成人一区二区三区中文字幕| 亚洲国产精品精华液2区45| 成人国产免费视频| 亚洲无人区一区| 久久无码av三级| 欧美婷婷六月丁香综合色| 精品在线播放午夜| 亚洲欧美怡红院| 日韩一级片在线播放| jlzzjlzz亚洲女人18| 亚洲一区在线观看免费| 久久久91精品国产一区二区三区| 成人免费看的视频| 日韩国产精品大片| 亚洲欧洲99久久| 欧美成人女星排名| 欧美三级电影在线看| 成人免费视频视频在线观看免费 | 日韩欧美国产综合一区| 99久久综合国产精品| 久久国产精品72免费观看| 亚洲一区二区三区在线播放| 国产色综合久久| 日韩精品专区在线| 欧美日韩三级在线| 日本乱码高清不卡字幕| 成人黄色在线网站| 国产成人在线网站| 国产美女在线观看一区| 亚洲国产精品精华液网站| 中文字幕制服丝袜成人av| 91福利国产成人精品照片| 激情综合网天天干| 香蕉影视欧美成人| 亚洲精品高清在线| 国产欧美一区二区精品婷婷| 7777精品久久久大香线蕉| 色视频成人在线观看免| 国产v日产∨综合v精品视频| 人人爽香蕉精品| 午夜精品久久久久久久99樱桃| 一区二区三区在线免费播放 | 色婷婷av一区二区三区大白胸| 美女高潮久久久| 香蕉影视欧美成人| 三级一区在线视频先锋| 亚洲国产精品久久一线不卡| 亚洲国产精品一区二区久久| 日韩美女视频一区二区| 国产精品激情偷乱一区二区∴| 欧美一区二区三区喷汁尤物| 欧美一级久久久| 欧美日韩一区二区三区视频| 91九色最新地址| 色先锋资源久久综合| 91久久免费观看| 99久久国产综合精品女不卡| 99国产精品久久| 欧美日韩aaaaaa| 日韩精品中文字幕一区二区三区 | 国产成人鲁色资源国产91色综| 天使萌一区二区三区免费观看| 日韩av在线发布| 久久国产精品99精品国产| 精品亚洲免费视频| 欧美精品一区二区蜜臀亚洲| 久久久精品2019中文字幕之3| 日本一区二区在线不卡| 亚洲婷婷国产精品电影人久久| 亚洲天堂成人网| 丝袜亚洲另类欧美综合| 成人动漫一区二区三区| 91成人在线免费观看| 欧美成人乱码一区二区三区| 色av一区二区| 中文字幕精品一区二区精品绿巨人| 美女网站色91| 懂色av噜噜一区二区三区av| 图片区小说区区亚洲影院| 国产精品久久久久一区二区三区共| 欧美亚洲精品一区| 亚洲精品一区二区三区四区高清| 91在线小视频| 国产高清在线精品| 久久草av在线| 亚洲一二三区在线观看| 欧美国产乱子伦| 欧美va亚洲va| 欧美另类z0zxhd电影| 福利视频网站一区二区三区| 久久国产日韩欧美精品| 一区二区三区丝袜| 亚洲欧洲中文日韩久久av乱码| 精品国产髙清在线看国产毛片| 99久久伊人精品| 成人综合婷婷国产精品久久| 久久精品免费看| 国产一区二区三区免费观看| 五月天激情综合| 日韩经典中文字幕一区| 午夜电影一区二区三区| 日本不卡免费在线视频| 人妖欧美一区二区| 久久国产综合精品| 国产一区二区主播在线| 蜜桃av噜噜一区| 国产精品123区| 成人黄页毛片网站| 91丨九色porny丨蝌蚪| 99视频精品免费视频| 欧美日本韩国一区二区三区视频 | 国产原创一区二区| 成人午夜又粗又硬又大| 大美女一区二区三区| 一道本成人在线| 91精品国产综合久久久久久久久久 | 91亚洲精品久久久蜜桃网站| 国产jizzjizz一区二区| av午夜一区麻豆| 欧美性xxxxxxxx| 久久久久久9999| 中文字幕五月欧美| 亚洲国产成人porn| 天涯成人国产亚洲精品一区av| 蜜乳av一区二区三区| 91蜜桃网址入口| 欧美午夜免费电影| 中文字幕免费不卡在线| 一级做a爱片久久| 日本成人在线不卡视频| 成人精品视频一区| 日韩一区二区在线免费观看| 国产精品久久久久影院亚瑟 | 国产精品天干天干在线综合| 一级女性全黄久久生活片免费| 青青国产91久久久久久| 91视频国产观看| 国产三级一区二区| 日韩 欧美一区二区三区| 91蜜桃传媒精品久久久一区二区| 日韩精品在线一区| 五月天丁香久久| 91麻豆免费视频| 欧美激情在线免费观看| 激情国产一区二区| 99riav一区二区三区| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 成人的网站免费观看| 日韩一区二区影院| 久久黄色级2电影| 久久综合久久鬼色| 国产传媒久久文化传媒| 欧美激情在线观看视频免费| 国产91露脸合集magnet| 国产丝袜欧美中文另类| voyeur盗摄精品| 亚洲精品va在线观看| 4438亚洲最大| 久久丁香综合五月国产三级网站 | 综合欧美一区二区三区| 色综合久久99| 天堂成人国产精品一区| 7777精品伊人久久久大香线蕉完整版 | 国产精品香蕉一区二区三区| 久久久99免费| 色婷婷精品久久二区二区蜜臂av| 亚洲地区一二三色| 久久久五月婷婷| 日本高清成人免费播放|