1

我想使用chardet并将golang.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 代码以选择所需的解码器?(chardet返回小写代码页名称,例如windows-1250windows-1252

4

1 回答 1

2

这里最简单的解决方案也可能是最简单的一个:有一个工厂方法,它根据 IANA 代码返回适当的解码器/编码器。您需要做的唯一工作是将 IANA 代码映射到相应的charmaps。您可以在此处找到所有魅力图的列表。

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
}
于 2019-08-30T15:30:42.147 回答