我正在尝试将ISO 8859-1编码的字符串转换为UTF-8。
以下函数适用于包含德语变音符号的testdata,但我不太确定符文(b)演员的编码源代码。是假设某种默认编码,例如ISO8859-1或有什么方法可以告诉它使用什么编码?
func toUtf8(iso8859_1_buf []byte) string {
var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4))
for _, b := range(iso8859_1_buf) {
r := rune(b)
buf.WriteRune(r)
}
return string(buf.Bytes())
}
答案 0 :(得分:13)
符文是 int32 的别名,当涉及编码时,假定符文具有Unicode字符值(代码点)。因此b
中的值rune(b)
应该是unicode值。对于0x00 - 0xFF,此值与Latin-1相同,因此您不必担心它。
然后你需要将符文编码为UTF8。但是,只需将[]rune
转换为string
即可完成此编码。
这是一个不使用bytes包的函数示例:
func toUtf8(iso8859_1_buf []byte) string {
buf := make([]rune, len(iso8859_1_buf))
for i, b := range iso8859_1_buf {
buf[i] = rune(b)
}
return string(buf)
}
答案 1 :(得分:2)
的影响
r := rune(expression)
是:
r
声明变量rune
(int32的别名)。r
。不涉及(重新)编码,并且只能通过在代码中显式写入/处理某些重新编码来说明应该选择使用哪一个。幸运的是,在这种情况下,不需要(重新)编码,Unicode以与ASCII相当的方式合并了ISO 8859-1的代码。 (如果我检查正确here)