中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中多字節字符如何處理

發布時間:2021-06-24 09:45:53 來源:億速云 閱讀:165 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Go語言中多字節字符如何處理的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

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 編碼而設計的一種編碼規則。可以說 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 | 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 的總結和說明。

3 Unicode 包

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

Is(rangeTab *RangeTable, r rune) bool

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

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

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

unicode.Is(unicode.Scripts["Han"], 'k')
// 返回 false
unicode.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"])
// 返回 true
unicode.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')
// 返回 true
unicode.IsDigit('k')
// 返回 false

IsNumber(r rune) bool

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

IsLetter(r rune) bool

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

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

IsGraphic(r rune) bool

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

unicode.IsGraphic('9')
// 返回 true
unicode.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')
// 返回 false
unicode.IsPunct(',')
// 返回 true

IsSymbol(r rune) bool

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

IsLower(r rune) bool

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

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

IsUpper(r rune) bool

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

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

IsTitle(r rune) bool

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

unicode.IsTitle('?')
// 返回 true
unicode.IsTitle('h')
// 返回 false
unicode.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')
// 返回 h
unicode.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)
// 返回 true
utf8.FullRune(buf[:2])
// 返回 false

FullRuneInString(s string) bool

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

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

RuneCount(p []byte) int

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

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

RuneCountInString(s string) (n int)

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

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

RuneLen(r rune) int

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

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

RuneStart(b byte) bool

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

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

Valid(p []byte) bool

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

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

ValidRune(r rune) bool

檢測字符 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

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

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

感謝各位的閱讀!關于“Go語言中多字節字符如何處理”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长寿区| 伊金霍洛旗| 于都县| 太康县| 惠东县| 东方市| 巴南区| 柳州市| 吴旗县| 灵武市| 桐城市| 得荣县| 辽源市| 江北区| 土默特左旗| 梧州市| 马龙县| 康马县| 建平县| 舟山市| 大悟县| 五台县| 阿拉善左旗| 梁平县| 天等县| 田阳县| 株洲市| 山阳县| 眉山市| 郓城县| 盐池县| 醴陵市| 海林市| 姚安县| 永修县| 桦南县| 石林| 军事| 珲春市| 常德市| 文山县|