1 回答

TA貢獻1829條經驗 獲得超4個贊
正如 Tim Cooper 所指出的,您可以使用utf8.Valid
.
但!您可能認為將非 UTF-8 字節轉換為 Gostring
是不可能的。事實上,“在 Go 中,一個字符串實際上是一個只讀的字節片”;它可以包含無效的 UTF-8 字節,您可以打印這些字節、通過索引訪問、傳遞給WriteString
方法,甚至返回到 a []byte
(Write
例如)。
Go 語言中有兩個地方確實string
為你做s 的UTF-8 解碼。
當你這樣做時
for i, r := range s
,r
是一個 Unicode 代碼點作為類型的值rune
當您進行轉換時
[]rune(s)
,Go 會將整個字符串解碼為符文。
(請注意,這rune
是 的別名int32
,而不是完全不同的類型。)
在這兩種情況下,無效的 UTF-8 被替換為U+FFFD
,替換字符保留用于此類用途。更多信息請參見規范部分中關于s 和其他類型之間的for
語句和轉換string
的內容。這些轉換永遠不會崩潰,因此您只需要主動檢查 UTF-8 有效性是否與您的應用程序相關,例如如果您不能接受 U+FFFD 替換并且需要在錯誤編碼的輸入上引發錯誤。
由于該行為已融入語言,因此您也可以從庫中期待它。U+FFFD
isutf8.RuneError
并由 中的函數返回utf8
。
這是一個示例程序,顯示了 Go 對[]byte
持有無效 UTF-8 的處理:
package main
import "fmt"
func main() {
a := []byte{0xff}
s := string(a)
fmt.Println(s)
for _, r := range s {
fmt.Println(r)
}
rs := []rune(s)
fmt.Println(rs)
}
輸出在不同的環境中看起來會有所不同,但在 Playground 中看起來像
?
65533
[65533]
- 1 回答
- 0 關注
- 247 瀏覽
添加回答
舉報