1. 程式人生 > >golang 中unicode包用法

golang 中unicode包用法

本文轉自Golove部落格:http://www.cnblogs.com/golove/p/3273585.html

unicode 包中的函式和方法



// latters.go

const (
MaxRune = '\U0010FFFF' // Unicode 碼點最大值
ReplacementChar = '\uFFFD' // 代表無效的 Unicode 碼點
MaxASCII = '\u007F' // ASCII 碼點最大值
MaxLatin1 = '\u00FF' // Latin-1 碼點最大值
)

------------------------------------------------------------

// 判斷字元 r 是否在 rangtab 表範圍內
func Is(rangeTab *RangeTable, r rune) bool

func main() {
s := "Hello 世界!"
for _, r := range s {
// 判斷字元是否為漢字
if unicode.Is(unicode.Scripts["Han"], r) {
fmt.Printf("%c", r) // 世界
}
}
}

------------------------------------------------------------

// 判斷字元 r 是否為大寫格式
func IsUpper(r rune) bool

func main() {
s := "Hello ABC!"
for _, r := range s {
// 判斷字元是否為大寫
if unicode.IsUpper(r) {
fmt.Printf("%c", r) // HABC
}
}
}

------------------------------------------------------------

// 判斷字元 r 是否為小寫格式
func IsLower(r rune) bool

func main() {
s := "Hello abc!"
for _, r := range s {
if unicode.IsLower(r) {
fmt.Printf("%c", r) // elloabc
}
}
}

------------------------------------------------------------

// 判斷字元 r 是否為 Unicode 規定的 Title 字元
// 大部分字元的 Title 格式就是其大寫格式
// 只有少數字符的 Title 格式是特殊字元
// 這裡判斷的就是特殊字元
func IsTitle(r rune) bool

func main() {
s := "Hello ᾏᾟᾯ!"
for _, r := range s {
if unicode.IsTitle(r) {
fmt.Printf("%c", r) // ᾏᾟᾯ
}
}
}

// 輸出 Unicode 規定的 Title 字元
func main() {
for _, cr := range unicode.Lt.R16 {
for i := cr.Lo; i <= cr.Hi; i += cr.Stride {
fmt.Printf("%c", i)
}
fmt.Println("")
}
}

------------------------------------------------------------

// To 將字元 r 轉換為指定的格式
// _case 取值:UpperCase、LowerCase、TitleCase
func To(_case int, r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.To(unicode.UpperCase, r))
} // HELLO 世界!
for _, r := range s {
fmt.Printf("%c", unicode.To(unicode.LowerCase, r))
} // hello 世界!
for _, r := range s {
fmt.Printf("%c", unicode.To(unicode.TitleCase, r))
} // HELLO 世界!
}

------------------------------------------------------------

// ToUpper 將字元 r 轉換為大寫格式
func ToUpper(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.ToUpper(r))
} // HELLO 世界!
}

------------------------------------------------------------

// ToLower 將字元 r 轉換為小寫格式
func ToLower(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.ToLower(r))
} // hello 世界!
}

------------------------------------------------------------

// ToTitle 將字元 r 轉換為 Title 格式
// 大部分字元的 Title 格式就是其大寫格式
// 只有少數字符的 Title 格式是特殊字元
func ToTitle(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.ToTitle(r))
} // HELLO 世界!
}

------------------------------------------------------------

// SpecialCase 是特定語言環境下的對映表,例如“土耳其”
// SpecialCase 的方法集定製了標準的對映
type SpecialCase []CaseRange

------------------------------------------------------------

// ToUpper 將 r 轉換為大寫格式
// 優先使用指定的對映表 special
func (special SpecialCase) ToUpper(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.SpecialCase(unicode.CaseRanges).ToUpper(r))
} // HELLO 世界!
}

------------------------------------------------------------

// ToLower 將 r 轉換為小寫格式
// 優先使用指定的對映表 special
func (special SpecialCase) ToLower(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.SpecialCase(unicode.CaseRanges).ToLower(r))
} // hello 世界!
}

------------------------------------------------------------

// ToTitle 將 r 轉換為 Title 格式
// 優先使用指定的對映表 special
func (special SpecialCase) ToTitle(r rune) rune

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c", unicode.SpecialCase(unicode.CaseRanges).ToTitle(r))
} // HELLO 世界!
}

------------------------------------------------------------

// SimpleFold 遍歷 Unicode ,查詢“下一個”與 r 相當的字元,
// “下一個”的意思是:碼點值比 r 大且最靠近 r 的字元
// 如果沒有“下一個”字元,則從頭開始找與 r 相當的字元
// “相當”的意思是:同一個字元在不同情況下有不同的寫法
// 這些不同寫法的字元是相當的。
// 這個函式通過查詢 caseOrbit 表實現
//
// 例如:
// SimpleFold('A') = 'a'
// SimpleFold('a') = 'A'
//
// SimpleFold('K') = 'k'
// SimpleFold('k') = '\u212A' (開爾文符號:K)
// SimpleFold('\u212A') = 'K'
//
// SimpleFold('1') = '1'
//
func SimpleFold(r rune) rune

func main() {
fmt.Printf("%c\n", unicode.SimpleFold('Φ')) // φ
fmt.Printf("%c\n", unicode.SimpleFold('φ')) // ϕ
fmt.Printf("%c\n", unicode.SimpleFold('ϕ')) // Φ
}



============================================================



// digit.go

------------------------------------------------------------

// IsDigit 判斷 r 是否為一個十進位制的數字字元
func IsDigit(r rune) bool

func main() {
s := "Hello 123123!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsDigit(r))
} // 123123 = true
}



============================================================



// graphic.go

------------------------------------------------------------

// IsGraphic 判斷字元 r 是否為一個“圖形字元”
// “圖形字元”包括字母、標記、數字、標點、符號、空格
// 他們分別對應於 L、M、N、P、S、Zs 類別
// 這些類別是 RangeTable 型別,儲存了相應類別的字元範圍
func IsGraphic(r rune) bool

func main() {
s := "Hello 世界!\t"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsGraphic(r))
} // \t = false
}

------------------------------------------------------------

// IsPrint 判斷字元 r 是否為 Go 所定義的“可列印字元”
// “可列印字元”包括字母、標記、數字、標點、符號和 ASCII 空格
// 他們分別對應於 L, M, N, P, S 類別和 ASCII 空格
// “可列印字元”和“圖形字元”基本是相同的,不同之處在於
// “可列印字元”只包含 Zs 類別中的 ASCII 空格(U+0020)
func IsPrint(r rune) bool

func main() {
s := "Hello 世界!\t"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsPrint(r))
} // 全形空格= false \t = false
}

------------------------------------------------------------

// IsOneOf 判斷 r 是否在 set 表範圍內
func IsOneOf(set []*RangeTable, r rune) bool

func main() {
s := "Hello 世界!"
// set 表設定為“漢字、標點符號”
set := []*unicode.RangeTable{unicode.Han, unicode.P}
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsOneOf(set, r))
} // 世界! = true
}

------------------------------------------------------------

// IsControl 判斷 r 是否為一個控制字元
// Unicode 類別 C 包含更多字元,比如代理字元
// 使用 Is(C, r) 來測試它們
func IsControl(r rune) bool

func main() {
s := "Hello\n\t世界!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsControl(r))
} // \n\t = true
}

------------------------------------------------------------

// IsLetter 判斷 r 是否為一個字母字元 (類別 L)
// 漢字也是一個字母字元
func IsLetter(r rune) bool

func main() {
s := "Hello\n\t世界!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsLetter(r))
} // Hello世界 = true
}

------------------------------------------------------------

// IsMark 判斷 r 是否為一個 mark 字元 (類別 M)
func IsMark(r rune) bool

func main() {
s := "Hello ៉៊់៌៍!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsMark(r))
} // ៉៊់៌៍ = true
}

// 輸出所有 mark 字元
func main() {
for _, cr := range unicode.M.R16 {
for i := uint16(cr.Lo); i >= cr.Lo && i <= cr.Hi; i += uint16(cr.Stride) {
fmt.Printf("%c = %v\n", i, unicode.IsMark(rune(i)))
}
fmt.Println("")
}
}

------------------------------------------------------------

// IsNumber 判斷 r 是否為一個數字字元 (類別 N)
func IsNumber(r rune) bool

func main() {
s := "Hello 123123!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsNumber(r))
} // 123123 = true
}

------------------------------------------------------------

// IsPunct 判斷 r 是否為一個標點字元 (類別 P)
func IsPunct(r rune) bool

func main() {
s := "Hello 世界!"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsPunct(r))
} // ! = true
}

------------------------------------------------------------

// IsSpace 判斷 r 是否為一個空白字元
// 在 Latin-1 字符集中,空白字元為:\t, \n, \v, \f, \r,
// 空格, U+0085 (NEL), U+00A0 (NBSP)
// 其它空白字元的定義有“類別 Z”和“Pattern_White_Space 屬性”
func IsSpace(r rune) bool

func main() {
s := "Hello \t世 界!\n"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsSpace(r))
} // 空格\t全形空格\n = true
}

------------------------------------------------------------

// IsSymbol 判斷 r 是否為一個符號字元
func IsSymbol(r rune) bool

func main() {
s := "Hello (<世=界>)"
for _, r := range s {
fmt.Printf("%c = %v\n", r, unicode.IsSymbol(r))
} // <=> = true
}