Character encoding golang将iso8859-1转换为utf8

Character encoding golang将iso8859-1转换为utf8,character-encoding,go,Character Encoding,Go,我正在尝试将ISO 8859-1编码字符串转换为UTF-8 下面的函数适用于我的testdata,它包含德语umlauts,但我不太确定符文(b)cast的源代码是什么。它是否假定某种默认编码,例如ISO8859-1,或者是否有任何方法告诉它使用什么编码 func toUtf8(iso8859_1_buf []byte) string { var buf = bytes.NewBuffer(make([]byte, len(iso8859_1_buf)*4)) for _, b :=

我正在尝试将ISO 8859-1编码字符串转换为UTF-8

下面的函数适用于我的testdata,它包含德语umlauts,但我不太确定符文(b)cast的源代码是什么。它是否假定某种默认编码,例如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())
}
符文是int32的别名,在编码时,假定符文具有Unicode字符值(代码点)。因此
rune(b)
中的
b
值应该是unicode值。对于0x00-0xFF,该值与拉丁语-1相同,因此您不必担心它

然后你需要将符文编码成UTF8。但这种编码只需将
[]符文
转换为
字符串

这是一个不使用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)
}
影响

r := rune(expression)
是:

  • 使用类型
    rune
    (int32的别名)声明变量
    r
  • 用expresion的值初始化变量
    r

不涉及(重新)编码,只有通过在代码中显式地编写/处理一些重新编码,才能说明应该选择使用哪种编码。幸运的是,在这种情况下不需要(重新)编码,Unicode以与ASCII类似的方式合并了ISO 8859-1的代码。(如果我检查正确)

需要重新编码。像ö这样的字母编码方式不同。如果您有字节字符串
latin1=[]字节{0x52,0xE4,0x76}
,它将无法很好地转换为字符串。(它在拉丁语-1中表示Räv),但0xE4在ISO 8859-1中实际上是
ä
,而不是
ä
。检查这里:啊,我想我误解了。确实,在Latin-1和Unicode之间不需要重新编码。是的,字节序列是RävBy顺便说一句,你的意思是iso8859-1,对吗?是的,很抱歉混淆了,我已经编辑过了。可以使用golang.org/x/text/encoding/charmap从iso-8859编码字符串进行显式转换,我认为只有0x7f以下的值是相同的,感谢您指出这一点。Unicode和Latin-1中的值是相同的(Latin-1可以被视为Unicode的0x00-0xFF子集)。但在存储值时,拉丁语-1仅使用1个字节(例如
0x41
),而Unicode使用4个字节(例如
0x00000041
)。可能会混淆的是UTF-8编码,其中只有0x00-0x7F以与拉丁语-1相同的方式编码,使用一个字节。它在@AdrienParrochia不起作用。您有一个1)utf8编码字符串2)被解码为拉丁语1 3)复制到Go字节片中,其中错误文本被编码为utf8 4)传递到一个函数中,该函数尝试将其重新编码为utf8。没有,只是没有:)。在此期间,您丢失了一些数据(由unicode
占位符字符显示)。你想要这样的东西: