1 回答

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