1 回答

TA貢獻1815條經驗 獲得超6個贊
嘗試這個:
slice1 := []rune{'\u0041', '\u0042', '\u0043', '\u20AC', -1}
st := string(slice1)
slice2 := []rune(st)
fmt.Println(slice2[4] == '\uFFFD') // true
由于s[4]是-1結果s[4] == '\uFFFD'是錯誤的。
'\uFFFD'是ReplacementChar代表無效代碼點的 。
并且是無效代碼點的替換,例如-1,使用string([]rune{'A', -1})替換-1為'\uFFFD',試試這個:
package main
import (
"fmt"
"unicode"
"unicode/utf8"
)
func main() {
fmt.Println(unicode.ReplacementChar)
fmt.Println(utf8.ValidRune(unicode.ReplacementChar))
rs := []rune{'A', -1}
s := string(rs)
fmt.Println(s)
fmt.Println([]rune(s)) //[65 65533]
}
有效符文
func ValidRune(r rune) bool
ValidRune 報告 r 是否可以合法地編碼為 UTF-8。超出范圍或代理一半的代碼點是非法的。
const (
surrogateMin = 0xD800
surrogateMax = 0xDFFF
MaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
)
// ValidRune reports whether r can be legally encoded as UTF-8.
// Code points that are out of range or a surrogate half are illegal.
func ValidRune(r rune) bool {
switch {
case 0 <= r && r < surrogateMin:
return true
case surrogateMax < r && r <= MaxRune:
return true
}
return false
}
例子:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
slice := []rune{'\u0041', '\u0042', '\u0043', '\u20AC', '\uFFFD', 0xfffffff, -1}
for i, v := range slice {
fmt.Printf("%d %q %v\n", i, v, utf8.ValidRune(v))
}
}
輸出:
0 'A' true
1 'B' true
2 'C' true
3 '€' true
4 '?' true
5 %!q(int32=268435455) false
6 %!q(int32=-1) false
- 1 回答
- 0 關注
- 186 瀏覽
添加回答
舉報