为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2021-05-21 18:15:28
在Go中,我想逐行将文件读入str或中[]rune。该文件应使用UTF-8编码,但是我的程序不应该信任它。如果它包含无效的UTF-8,我想正确处理该错误。有bytes.Runes(s []byte) []rune,但没有错误返回值。在遇到无效的UTF-8时会惊慌吗?
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

例如,


package main


import (

    "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


查看完整回答
反对 回复 2021-05-24
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

例如:


import (

    "io/ioutil"

    "log"

    "unicode/utf8"

)


// ...


buf, err := ioutil.ReadAll(fname)

if error != nil {

        log.Fatal(err)

}


size := 0

for start := 0; start < len(buf); start += size {

        var r rune

        if r, size = utf8.DecodeRune(buf[start:]); r == utf8.RuneError {

                log.Fatalf("invalid utf8 encoding at ofs %d", start)

        }

}

utf8.DecodeRune godocs:


DecodeRune在p中解压缩第一个UTF-8编码,并返回符文及其宽度(以字节为单位)。如果编码无效,则返回(RuneError,1),这对于正确的UTF-8来说是不可能的结果。


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 387 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信