亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢測 Go 中何時無法將字節轉換為字符串?

如何檢測 Go 中何時無法將字節轉換為字符串?

Go
慕森王 2021-12-13 10:23:16
存在無法轉換為 Unicode 字符串的無效字節序列。如何檢測轉換時[]byte要string進去嗎?
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

正如 Tim Cooper 所指出的,您可以使用utf8.Valid.

但!您可能認為將非 UTF-8 字節轉換為 Gostring是不可能的。事實上,“在 Go 中,一個字符串實際上是一個只讀的字節片”;它可以包含無效的 UTF-8 字節,您可以打印這些字節、通過索引訪問、傳遞給WriteString方法,甚至返回到 a []byteWrite例如)。

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+FFFDisutf8.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]


查看完整回答
反對 回復 2021-12-13
  • 1 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號