将utf-8转换为单字节编码

时间:2018-10-19 14:25:06

标签: go utf-8 character-encoding

我有一批编码错误的记录。 这种一线给我一个正确的结果

cat example.txt | iconv -f utf-8 -t iso8859-2

但是以下程序给我一个错误encoding: rune not supported by encoding.

func main() {
    s:= []byte {196, 144, 194, 154, 196, 144, 194, 176, 196, 144, 197, 186, 196, 144, 196, 190, 197, 131, 194, 128, 196, 144, 194, 176, 32, 52, 52, 53, 54, 50, 53, 54, 10, 10, 0, 0, }
    fmt.Println(s)

    dec := charmap.ISO8859_2.NewEncoder()
    out, err := dec.Bytes(s)
    if err != nil {
        fmt.Println(err)
        return
    }
    expectedOutput := "Камера 4456256"      
    fmt.Println("result", string(out), "expect:", expectedOutput)
}

我想知道没有iconv绑定是否可以解决我的问题?

1 个答案:

答案 0 :(得分:2)

搜索charmap.ISO8859_2表示您正在使用golang.org/x/text

在这里,给出给定Charmap,我们将了解转换是如何完成的:

https://github.com/golang/text/blob/4d1c5fb19474adfe9562c9847ba425e7da817e81/encoding/charmap/charmap.go#L206

特定行突出显示错误的来源。因此,您输入的内容包含utf8中的字符,这些字符无法在iso8859-2中表示或无效的utf8。

Here,您发现错误是如实地处理的,在RepertoireError中使用replacement似乎是一个红色鲱鱼。

当然,您不需要iconv绑定。您可以逐个字符地迭代输入的字符并将其编码为iso8859-2并决定自己如何处理无法表示的字符。