如何读取文件,如果它不是有效的UTF-8,则出错并中止?

在Go中,我想逐行将文件读入str或中[]rune

该文件应使用UTF-8编码,但是我的程序不应该信任它。如果它包含无效的UTF-8,我想正确处理该错误。

bytes.Runes(s []byte) []rune,但没有错误返回值。在遇到无效的UTF-8时会惊慌吗?


当年话下
浏览 388回答 2
2回答

幕布斯6054654

例如,package mainimport (    "bufio"    "fmt"    "io/ioutil"    "os"    "strings"    "unicode/utf8")func main() {    tFile := "text.txt"    t := []byte{'\xFF', '\n'}    ioutil.WriteFile(tFile, t, 0666)    f, err := os.Open(tFile)    if err != nil {        fmt.Println(err)        os.Exit(1)    }    defer f.Close()    r := bufio.NewReader(f)    s, err := r.ReadString('\n')    if err != nil {        fmt.Println(err)        os.Exit(1)    }    s = strings.TrimRight(s, "\n")    fmt.Println(t, s, []byte(s))    if !utf8.ValidString(s) {        fmt.Println("!utf8.ValidString")    }}输出:[255 10] � [255]!utf8.ValidString

有只小跳蛙

例如:import (&nbsp; &nbsp; "io/ioutil"&nbsp; &nbsp; "log"&nbsp; &nbsp; "unicode/utf8")// ...buf, err := ioutil.ReadAll(fname)if error != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)}size := 0for start := 0; start < len(buf); start += size {&nbsp; &nbsp; &nbsp; &nbsp; var r rune&nbsp; &nbsp; &nbsp; &nbsp; if r, size = utf8.DecodeRune(buf[start:]); r == utf8.RuneError {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Fatalf("invalid utf8 encoding at ofs %d", start)&nbsp; &nbsp; &nbsp; &nbsp; }}utf8.DecodeRune godocs:DecodeRune在p中解压缩第一个UTF-8编码,并返回符文及其宽度(以字节为单位)。如果编码无效,则返回(RuneError,1),这对于正确的UTF-8来说是不可能的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go