通过 IANA 代码将 Windows 文本文件转换为 utf-8

Converting Windows text files to utf-8 via IANA codes

我想使用 chardetgolang.org/x/text 将非 utf-8 文件转换为 utf-8。但是,到目前为止我发现的所有代码示例都要求用户对所需的转换方向进行硬编码。例如:

package main

import (
  "fmt"
  "io/ioutil"
  "os"
  "golang.org/x/text/encoding/charmap"
)

func main() {

  // Write the string
  // encoded to Windows-1252
  encoder := charmap.Windows1252.NewEncoder()
  s, e := encoder.String("This is sample text with runes Š")
  if e != nil {
    panic(e)
  }
  ioutil.WriteFile("example.txt", []byte(s), os.ModePerm)

  // Decode to UTF-8
  f, e := os.Open("example.txt")
  if e != nil {
    panic(e)
  }
  defer f.Close()
  decoder := charmap.Windows1252.NewDecoder()
  reader := decoder.Reader(f)
  b, err := ioutil.ReadAll(reader)
  if err != nil {
    panic(err)
  }
  fmt.Println(string(b))
}

我需要如何更改以下行:

decoder := charmap.Windows1252.NewDecoder()

接受 IANA 代码以 select 所需的解码器? (chardet returns 小写代码页名称,例如 windows-1250windows-1252 等)

此处最简单的解决方案也可能是最简单的解决方案:拥有一个工厂方法,该方法 returns 是基于 IANA 代码的适当 decoder/encoder。您需要做的唯一工作就是将 IANA 代码映射到相应的字符映射。您可以找到所有 charmaps here.

的列表
var codeToCharmap map[string]*charmap.Charmap

func init() {
    codeToCharmap = map[string]*charmap.Charmap{
        "windows-1250": charmap.Windows1250,
        "windows-1252": charmap.Windows1252,
        // ...
    }
}

func getDecoder(code string) *encoding.Decoder {
    if cm, ok := codeToCharmap[code]; ok {
        return cm.NewDecoder()
    }

    return nil
}

func getEncoder(code string) *encoding.Encoder {
    if cm, ok := codeToCharmap[code]; ok {
        return cm.NewEncoder()
    }

    return nil
}