...

Package utf8

import "unicode/utf8"
概览
索引
示例

概览 ▾

utf8 包实现了支持UTF-8文本编码的函数和常量. 其中包括了在符文和UTF-8字节序列之间进行转译的函数。

常量

const (
    RuneError = '\uFFFD'     // the "error" Rune or "Unicode replacement character" // “错误”符文或“Unicode替换字符”
    RuneSelf  = 0x80         // characters below Runeself are represented as themselves in a single byte. // RuneSelf 值以下的字符以单个字节表示其自身。
    MaxRune   = '\U0010FFFF' // Maximum valid Unicode code point. // 最大的有效Unicode码点。
    UTFMax    = 4            // maximum number of bytes of a UTF-8 encoded Unicode character. // UTF-8编码的Unicode字符的最大字节数。
)

用于编码的基本数值。

func DecodeLastRune

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

DecodeLastRune 解包 p 中的最后一个UTF-8编码,并返回该符文及其字节宽度。 若此编码无效,它就会返回 (RuneError, 1),即一个对于正确的UTF-8来说不可能的值。 若一个编码为错误的UTF-8值,或该符文的编码超出范围,或不是该值可能的最短UTF-8编码, 那么它就是无效的。除此之外,并不进行其它的验证。

示例

代码:

b := []byte("Hello, 世界")

for len(b) > 0 {
    r, size := utf8.DecodeLastRune(b)
    fmt.Printf("%c %v\n", r, size)

    b = b[:len(b)-size]
}

输出:

界 3
世 3
  1
, 1
o 1
l 1
l 1
e 1
H 1

func DecodeLastRuneInString

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

DecodeLastRuneInString 类似于 DecodeLastRune,但其输入为字符串。 若此编码无效,它就会返回 (RuneError, 1),即一个对于正确的UTF-8来说不可能的值。 若一个编码为错误的UTF-8值,或该符文的编码超出范围,或不是该值可能的最短UTF-8编码, 那么它就是无效的。除此之外,并不进行其它的验证。

示例

代码:

str := "Hello, 世界"

for len(str) > 0 {
    r, size := utf8.DecodeLastRuneInString(str)
    fmt.Printf("%c %v\n", r, size)

    str = str[:len(str)-size]
}

输出:

界 3
世 3
  1
, 1
o 1
l 1
l 1
e 1
H 1

func DecodeRune

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

DecodeRune 解包 p 中的第一个UTF-8编码,并返回该符文及其字节宽度。 若此编码无效,它就会返回 (RuneError, 1),即一个对于正确的UTF-8来说不可能的值。 若一个编码为错误的UTF-8值,或该符文的编码超出范围,或不是该值可能的最短UTF-8编码, 那么它就是无效的。除此之外,并不进行其它的验证。

示例

代码:

b := []byte("Hello, 世界")

for len(b) > 0 {
    r, size := utf8.DecodeRune(b)
    fmt.Printf("%c %v\n", r, size)

    b = b[size:]
}

输出:

H 1
e 1
l 1
l 1
o 1
, 1
  1
世 3
界 3

func DecodeRuneInString

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

DecodeRuneInString 类似于 DecodeRune,但其输入为字符串。 若此编码无效,它就会返回 (RuneError, 1),即一个对于正确的UTF-8来说不可能的值。 若一个编码为错误的UTF-8值,或该符文的编码超出范围,或不是该值可能的最短UTF-8编码, 那么它就是无效的。除此之外,并不进行其它的验证。

示例

代码:

str := "Hello, 世界"

for len(str) > 0 {
    r, size := utf8.DecodeRuneInString(str)
    fmt.Printf("%c %v\n", r, size)

    str = str[size:]
}

输出:

H 1
e 1
l 1
l 1
o 1
, 1
  1
世 3
界 3

func EncodeRune

func EncodeRune(p []byte, r rune) int

EncodeRune 将该符文的UTF-8编码写入到 p 中(它必须足够大)。 它返回写入的字节数。

示例

代码:

r := '世'
buf := make([]byte, 3)

n := utf8.EncodeRune(buf, r)

fmt.Println(buf)
fmt.Println(n)

输出:

[228 184 150]
3

func FullRune

func FullRune(p []byte) bool

FullRune 报告 p 中的字节是否以全UTF-8编码的符文开始。 无效的编码取被视作一个完整的符文,因为它会转换成宽度为1的错误符文。

示例

代码:

buf := []byte{228, 184, 150} // 世
fmt.Println(utf8.FullRune(buf))
fmt.Println(utf8.FullRune(buf[:2]))

输出:

true
false

func FullRuneInString

func FullRuneInString(s string) bool

FullRuneInString 类似于 FullRune,但其输入为字符串。

示例

代码:

str := "世"
fmt.Println(utf8.FullRuneInString(str))
fmt.Println(utf8.FullRuneInString(str[:2]))

输出:

true
false

func RuneCount

func RuneCount(p []byte) int

RuneCount 返回 p 中的符文数。 错误编码和短编码将被视作宽度为1字节的单个符文。

示例

代码:

buf := []byte("Hello, 世界")
fmt.Println("bytes =", len(buf))
fmt.Println("runes =", utf8.RuneCount(buf))

输出:

bytes = 13
runes = 9

func RuneCountInString

func RuneCountInString(s string) (n int)

RuneCountInString 类似于 RuneCount,但其输入为字符串。

示例

代码:

str := "Hello, 世界"
fmt.Println("bytes =", len(str))
fmt.Println("runes =", utf8.RuneCountInString(str))

输出:

bytes = 13
runes = 9

func RuneLen

func RuneLen(r rune) int

RuneLen 返回编码该符文所需的字节数。 若该符文并非有效的UTF-8编码值,就返回 -1。

示例

代码:

fmt.Println(utf8.RuneLen('a'))
fmt.Println(utf8.RuneLen('界'))

输出:

1
3

func RuneStart

func RuneStart(b byte) bool

RuneStart 报告该字节是否为符文编码的第一个字节。 第二个及后续字节的最高两位总是置为 10。

示例

代码:

buf := []byte("a界")
fmt.Println(utf8.RuneStart(buf[0]))
fmt.Println(utf8.RuneStart(buf[1]))
fmt.Println(utf8.RuneStart(buf[2]))

输出:

true
true
false

func Valid

func Valid(p []byte) bool

Valid 报告 p 是否完全由有效的,UTF-8编码的符文构成。

示例

代码:

valid := []byte("Hello, 世界")
invalid := []byte{0xff, 0xfe, 0xfd}

fmt.Println(utf8.Valid(valid))
fmt.Println(utf8.Valid(invalid))

输出:

true
false

func ValidRune

func ValidRune(r rune) bool

ValidRune 报告 r 是否能合法地作为UTF-8编码。 超出返回或半替代值的码点是非法的。

示例

代码:

valid := 'a'
invalid := rune(0xfffffff)

fmt.Println(utf8.ValidRune(valid))
fmt.Println(utf8.ValidRune(invalid))

输出:

true
false

func ValidString

func ValidString(s string) bool

ValidString 报告 s 是否完全由有效的,UTF-8编码的符文构成。

示例

代码:

valid := "Hello, 世界"
invalid := string([]byte{0xff, 0xfe, 0xfd})

fmt.Println(utf8.ValidString(valid))
fmt.Println(utf8.ValidString(invalid))

输出:

true
false