utf8
utf8
https://pkg.go.dev/unicode/utf8@go1.20.1
utf8包实现了支持使用 UTF-8 编码的文本的函数和常量。它包括了在符文和 UTF-8 字节序列之间进行转换的函数。参见 https://en.wikipedia.org/wiki/UTF-8。
常量
View Source
1
2
3
4
5
6
| const (
RuneError = '\uFFFD' // "错误" 符文或 "Unicode 替换字符"
RuneSelf = 0x80 // 低于 RuneSelf 的字符可以用单个字节表示。
MaxRune = '\U0010FFFF' // 最大有效 Unicode 代码点。
UTFMax = 4 // 一个 UTF-8 编码的 Unicode 字符的最大字节数。
)
|
这些数字是编码中的基本要素。
变量
This section is empty.
函数
func AppendRune <- go1.18
1
| func AppendRune(p []byte, r rune) []byte
|
AppendRune函数将 r 的 UTF-8 编码附加到 p 的结尾并返回扩展后的缓冲区。如果符文超出范围,则附加 RuneError 的编码。
AppendRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
buf1 := utf8.AppendRune(nil, 0x10000)
buf2 := utf8.AppendRune([]byte("init"), 0x10000)
fmt.Println(string(buf1))
fmt.Println(string(buf2))
}
Output:
𐀀
init𐀀
|
func DecodeLastRune
1
| func DecodeLastRune(p []byte) (r rune, size int)
|
DecodeLastRune函数解码p中的最后一个UTF-8编码,并返回该符文及其占用的字节数。如果p为空,则返回(RuneError,0)。否则,如果编码无效,则返回(RuneError,1)。对于正确的非空UTF-8,这两种情况都是不可能的。
如果编码不正确,编码超出范围或不是该值的最短可能UTF-8编码,则编码无效。不执行其他验证。
DecodeLastRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
b := []byte("Hello, 世界")
for len(b) > 0 {
r, size := utf8.DecodeLastRune(b)
fmt.Printf("%c %v\n", r, size)
b = b[:len(b)-size]
}
}
Output:
界 3
世 3
1
, 1
o 1
l 1
l 1
e 1
H 1
|
func DecodeLastRuneInString
1
| func DecodeLastRuneInString(s string) (r rune, size int)
|
DecodeLastRuneInString函数类似于DecodeLastRune,但其输入为字符串。如果s为空,则返回(RuneError,0)。否则,如果编码无效,则返回(RuneError,1)。对于正确的非空UTF-8,这两种情况都是不可能的。
如果编码不正确,编码超出范围或不是该值的最短可能UTF-8编码,则编码无效。不执行其他验证。
DecodeLastRuneInString Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "Hello, 世界"
for len(str) > 0 {
r, size := utf8.DecodeLastRuneInString(str)
fmt.Printf("%c %v\n", r, size)
str = str[:len(str)-size]
}
}
Output:
界 3
世 3
1
, 1
o 1
l 1
l 1
e 1
H 1
|
func DecodeRune
1
| func DecodeRune(p []byte) (r rune, size int)
|
DecodeRune函数解码p中的第一个UTF-8编码,并返回该符文及其占用的字节数。如果p为空,则返回(RuneError,0)。否则,如果编码无效,则返回(RuneError,1)。对于正确的非空UTF-8,这两种情况都是不可能的。
如果编码不正确,编码超出范围或不是该值的最短可能UTF-8编码,则编码无效。不执行其他验证。
DecodeRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
b := []byte("Hello, 世界")
for len(b) > 0 {
r, size := utf8.DecodeRune(b)
fmt.Printf("%c %v\n", r, size)
b = b[size:]
}
}
Output:
H 1
e 1
l 1
l 1
o 1
, 1
1
世 3
界 3
|
func DecodeRuneInString
1
| func DecodeRuneInString(s string) (r rune, size int)
|
DecodeRuneInString函数类似于DecodeRune函数,但其输入为字符串。如果s为空,则返回(RuneError,0)。否则,如果编码无效,则返回(RuneError,1)。对于正确的非空UTF-8,这两种情况都是不可能的。
如果编码不正确,编码超出范围或不是该值的最短可能UTF-8编码,则编码无效。不执行其他验证。
DecodeRuneInString Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "Hello, 世界"
for len(str) > 0 {
r, size := utf8.DecodeRuneInString(str)
fmt.Printf("%c %v\n", r, size)
str = str[size:]
}
}
Output:
H 1
e 1
l 1
l 1
o 1
, 1
1
世 3
界 3
|
func EncodeRune
1
| func EncodeRune(p []byte, r rune) int
|
EncodeRune writes into p (which must be large enough) the UTF-8 encoding of the rune. If the rune is out of range, it writes the encoding of RuneError. It returns the number of bytes written.
EncodeRune函数将符文的UTF-8编码写入p(p必须足够大)。如果符文超出范围,则写入RuneError的编码。返回写入的字节数。
EncodeRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
r := '世'
buf := make([]byte, 3)
n := utf8.EncodeRune(buf, r)
fmt.Println(buf)
fmt.Println(n)
}
Output:
[228 184 150]
3
|
EncodeRune Example(OutOfRange)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
runes := []rune{
// Less than 0, out of range.
-1,
// Greater than 0x10FFFF, out of range.
0x110000,
// The Unicode replacement character.
utf8.RuneError,
}
for i, c := range runes {
buf := make([]byte, 3)
size := utf8.EncodeRune(buf, c)
fmt.Printf("%d: %d %[2]s %d\n", i, buf, size)
}
}
Output:
0: [239 191 189] � 3
1: [239 191 189] � 3
2: [239 191 189] � 3
|
func FullRune
1
| func FullRune(p []byte) bool
|
FullRune函数报告p中的字节是否以完整的UTF-8符文编码开头。无效的编码被认为是完整的符文,因为它们将转换为宽度为1的错误符文。
FullRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
buf := []byte{228, 184, 150} // 世
fmt.Println(utf8.FullRune(buf))
fmt.Println(utf8.FullRune(buf[:2]))
}
Output:
true
false
|
func FullRuneInString
1
| func FullRuneInString(s string) bool
|
FullRuneInString函数类似于FullRune,但其输入是字符串。
FullRuneInString Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "世"
fmt.Println(utf8.FullRuneInString(str))
fmt.Println(utf8.FullRuneInString(str[:2]))
}
Output:
true
false
|
func RuneCount
1
| func RuneCount(p []byte) int
|
RuneCount函数返回p中符文的数量。错误和短编码被视为宽度为1个字节的单个符文。
RuneCount Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
buf := []byte("Hello, 世界")
fmt.Println("bytes =", len(buf))
fmt.Println("runes =", utf8.RuneCount(buf))
}
Output:
bytes = 13
runes = 9
|
func RuneCountInString
1
| func RuneCountInString(s string) (n int)
|
RuneCountInString函数类似于RuneCount,但其输入是字符串。
RuneCountInString Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "Hello, 世界"
fmt.Println("bytes =", len(str))
fmt.Println("runes =", utf8.RuneCountInString(str))
}
Output:
bytes = 13
runes = 9
|
func RuneLen
1
| func RuneLen(r rune) int
|
RuneLen函数返回编码符文所需的字节数。如果符文不是UTF-8的有效值,则返回-1。
RuneLen Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
fmt.Println(utf8.RuneLen('a'))
fmt.Println(utf8.RuneLen('界'))
}
Output:
1
3
|
func RuneStart
1
| func RuneStart(b byte) bool
|
RuneStart函数报告字节是否可以是编码的第一个字节,可能无效。第二个及后续字节的前两位始终设置为10。
RuneStart Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
buf := []byte("a界")
fmt.Println(utf8.RuneStart(buf[0]))
fmt.Println(utf8.RuneStart(buf[1]))
fmt.Println(utf8.RuneStart(buf[2]))
}
Output:
true
true
false
|
func Valid
1
| func Valid(p []byte) bool
|
Valid函数报告p是否完全由有效的UTF-8编码符文组成。
Valid Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
valid := []byte("Hello, 世界")
invalid := []byte{0xff, 0xfe, 0xfd}
fmt.Println(utf8.Valid(valid))
fmt.Println(utf8.Valid(invalid))
}
Output:
true
false
|
func ValidRune <- go1.1
1
| func ValidRune(r rune) bool
|
ValidRune函数报告r是否可以合法地编码为UTF-8。超出范围或替代字符的一半的代码点是非法的。
ValidRune Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
valid := 'a'
invalid := rune(0xfffffff)
fmt.Println(utf8.ValidRune(valid))
fmt.Println(utf8.ValidRune(invalid))
}
Output:
true
false
|
func ValidString
1
| func ValidString(s string) bool
|
ValidString函数报告s是否完全由有效的UTF-8编码符文组成。
ValidString Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"unicode/utf8"
)
func main() {
valid := "Hello, 世界"
invalid := string([]byte{0xff, 0xfe, 0xfd})
fmt.Println(utf8.ValidString(valid))
fmt.Println(utf8.ValidString(invalid))
}
Output:
true
false
|
类型
This section is empty.