【问题标题】:Converting Windows text files to utf-8 via IANA codes通过 IANA 代码将 Windows 文本文件转换为 utf-8
【发布时间】:2020-01-03 18:31:04
【问题描述】:

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

【问题讨论】:

    标签: go character-encoding file-conversion iana


    【解决方案1】:

    这里最简单的解决方案也可能是最简单的解决方案:有一个工厂方法,它根据 IANA 代码返回适当的解码器/编码器。您需要做的唯一工作是将 IANA 代码映射到相应的charmaps。你可以找到所有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
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 2013-10-10
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2015-10-08
      • 1970-01-01
      相关资源
      最近更新 更多