golang转换iso 8859 -1到utf8

vltsax25  于 2023-08-01  发布在  Go
关注(0)|答案(3)|浏览(200)

我正在尝试将ISO 8859-1编码的字符串转换为UTF-8。
下面的函数可以处理我的testdata,其中包含德语元音变音,但是我不太确定rune(b)转换假设的源代码编码。它是否假设某种默认编码,例如ISO 8859 -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())
}

字符串

juzqafwq

juzqafwq1#

  • rune* 是 * int 32 * 的别名,当涉及到编码时,rune被假定为具有Unicode字符值(码位)。所以rune(b)中的值b应该是一个unicode值。对于0x 00 - 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)
}

字符串

bksxznpy

bksxznpy2#

的效果

r := rune(expression)

字符串
是:

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

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

p5fdfcr1

p5fdfcr13#

要在任何ISO-8859变体(和其他流行的遗留代码页)和UTF-8之间进行转换,请使用golang.org/x/text/encoding/charmap
要解码此latin 1编码:

// rivière, è latin1-encoded as 233 (0xe9)
bLatin1 := []byte{114, 105, 118, 105, 233, 114, 101}

字符串
Charmap类型有一个返回 * 编码的NewDecoder方法。Decoder:

dec8859_1 := charmap.ISO8859_1.NewDecoder()


此解码器可以直接解码字节:

bUTF8, _ := dec8859_1.Bytes(bLatin1)

fmt.Printf("% #x\n", bLatin1) // 0x72 0x69 0x76 0x69 0xe9 0x72 0x65
fmt.Printf("% #x\n", bUTF8)   // 0x72 0x69 0x76 0x69 0xc3 0xa9 0x72 0x65


如果您的文件具有旧版编码:

f, _ := os.Create("foo.txt")
f.Write(bLatin1)
f.Write([]byte("\n"))
f.Write([]byte("Seine"))


使用解码器 Package 文件的Reader:

f, _ = os.Open("foo.txt")
rLatin1 := dec8859_1.Reader(f)


并传递新的解码器-读取器:

scanner := bufio.NewScanner(rLatin1)

for i := 1; scanner.Scan(); i++ {
    fmt.Printf("line %d: %s\n", i, scanner.Text())
}
// line 1: riviére
// line 2: Seine

相关问题