【问题标题】:golang convert iso8859-1 to utf8golang 将 iso8859-1 转换为 utf8
【发布时间】:2014-08-10 08:31:58
【问题描述】:

我正在尝试将 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())
}

【问题讨论】:

  • 对了,你的意思是iso8859-1,对吧?
  • 是的,很抱歉造成混乱,我已对其进行了编辑。
  • 可以使用 golang.org/x/text/encoding/charmap play.golang.org/p/D_lccJAqWtf 对 iso-8859 编码字符串进行显式转换

标签: character-encoding go


【解决方案1】:

runeint32 的别名,在编码方面,rune 被假定为具有 Unicode 字符值(代码点)。所以rune(b) 中的值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)
}

【讨论】:

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

效果

r := rune(expression)

是:

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

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

【讨论】:

  • 需要重新编码。像ö这样的字母不是以相同的方式编码的。如果您有字节字符串latin1 = []byte{0x52, 0xE4, 0x76},它将无法很好地转换为字符串。 (它用 Latin-1 写成 Räv
  • 但 0xE4 确实是 ä,而不是 ISO 8859-1 中的 öen.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout。在这里查看:play.golang.org/p/s4TfzJUa7m
  • 啊,我想我误会了。确实,Latin-1 和 Unicode 之间不需要重新编码。是的,字节序列说 Räv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2012-05-16
  • 2021-03-08
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多