Rune: 在Go中,字符被称为rune,它是int32的别名,用于表示一个Unicode码点。

DecodeRuneInString

utf8.DecodeRuneInString是Go标准库unicode/utf8包中的一个函数,它专门用于解码字符串中的第一个UTF-8编码的字符。

函数签名:

go func DecodeRuneInString(s string) (r rune, size int) 复制 s: 输入的字符串。 r: 解码的第一个字符(rune)。 size: 第一个字符占用的字节数。 工作原理:

函数从字符串的开始位置检查并解码第一个有效的UTF-8字符。如果遇到无效的UTF-8字符,它会返回Unicode替代字符’\uFFFD’。

\uFFFD

Go语言的字符串中可以存放任意的二进制字节序列,而且即使是UTF8字符序列也可能会遇到坏的编码。如果遇到一个错误的UTF8编码输入,将生成一个特别的Unicode字符‘\uFFFD’,这个字符在不同的软件中的显示效果可能不太一样,在印刷中这个符号通常是一个黑色六角形或钻石形状,里面包含一个白色的问号‘�’。下面的字符串中,我们故意损坏了第一字符的第二和第三字节,因此第一字符将会打印为“�”,第二和第三字节则被忽略,后面的“abc”依然可以正常解码打印(错误编码不会向后扩散是UTF8编码的优秀特性之一)。

1fmt.Println("\xe4\x00\x00\xe7\x95\x8cabc") // �界abc

不过在 for range 迭代这个含有损坏的UTF8字符串时,第一字符的第二和第三字 节依然会被单独迭代到,不过此时迭代的值是损坏后的0:

 1for i, c := range "\xe4\x00\x00\xe7\x95\x8cabc" {
 2fmt.Println(i, c)
 3}
 4// 0 65533 // \uFFFD, 对应 �
 5// 1 0 // 空字符
 6// 2 0 // 空字符
 7// 3 30028 // 界
 8// 6 97 // a
 9// 7 98 // b
10// 8 99 // c