13

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

以下函数适用于我的包含德语变音符号的测试数据,但我不太确定 rune(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())
}
4

2 回答 2

17

runeint32的别名,当涉及到编码时,假定 rune 具有 Unicode 字符值(代码点)。所以bin的值rune(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)
}
于 2012-11-22T11:11:15.313 回答
2

的效果

r := rune(expression)

是:

  • r用类型声明变量rune(int32 的别名)。
  • r用表达式的值初始化变量。

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

于 2012-11-22T11:16:12.033 回答