golang将iso8859-1转换为utf8

zer*_*oc8 12 character-encoding go

我正在尝试将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())
}
Run Code Online (Sandbox Code Playgroud)

ANi*_*sus 14

runeint32的别名,当涉及到编码时,假定符文具有Unicode字符值(代码点).因此,值brune(b)应该是一个Unicode值.对于0x00 - 0xFF,此值与Latin-1相同,因此您不必担心它.

然后你需要将符文编码为UTF8.但是这种编码只需将a转换[]runestring.

这是一个不使用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)
}
Run Code Online (Sandbox Code Playgroud)

  • Unicode和Latin-1中的值是相同的(Latin-1可以被认为是Unicode的0x00 - 0xFF子集).但是当你存储值时,Latin-1只使用1个字节(例如`0x41`),而Unicode使用4个字节(例如``0x00000041`).可能混淆的是UTF-8编码,其中仅使用单个字节以与Latin-1相同的方式编码0x00-0x7F. (3认同)
  • @AdrienParrochia你有一个1)utf8编码的字符串2)解码为latin1 3)复制到Go字节切片,其中错误文本被编码为utf8 4)传递到一个尝试将其重新编码为utf8的函数。不就是不 :) 。在此期间,您丢失了一些数据(由 unicode ‘?’ 占位符显示)。你想要这样的东西:https://play.golang.org/p/dBrx_ZmrsMN (2认同)