在Go中将任何编码转换为UTF 8

时间:2014-12-04 15:07:56

标签: mongodb encoding utf-8 go

我正在通过IMAP下载邮件。接下来我将解析的消息添加到MongoDB中。我有一个问题,因为MongoDB只支持UTF 8.我想将任何编码转换为UTF 8.代码是多种多样的。如何将每个字符串转换为UTF 8?

我知道,我可以转换为二进制文件,但我必须有正常的文本,因为我必须在数据库中搜索短语。除非,我能用二进制搜索普通文本吗?如果是,请给我代码将任何字符串转换为二进制,请。

请帮忙。

4 个答案:

答案 0 :(得分:2)

我正在使用go-charset项目执行此操作:https://code.google.com/p/go-charset/

这非常简单,您可以从字符集创建一个阅读器,它会自动转换为utf-8。来自图书馆的例子:

r, err := charset.NewReader("latin1", strings.NewReader("\xa35 for Pepp\xe9"))
if err != nil {
    log.Fatal(err)
}
result, err := ioutil.ReadAll(r)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%s\n", result)  //outputs £5 for Peppé

现在,在我的情况下,我知道charset,因为它来自网页,我读取了header / meta标签。如果您需要通过启发式方法自动检测字符集,则需要另外一个库,例如:https://github.com/saintfish/chardet

我没有使用它,但它看起来也很简单:

detector := chardet.NewTextDetector()
result, err := detector.DetectBest(some_text)
if err == nil {
    fmt.Printf(
        "Detected charset is %s, language is %s",
        result.Charset,
        result.Language)
}

答案 1 :(得分:1)

charset.NewReader中的

golang.org/x/net/html/charset无法处理编码gb2312charset.NewReaderLabel可以处理它。

import  (
    "io/ioutil"
    "golang.org/x/net/html/charset"
)

func convrtToUTF8(str string, origEncoding string) string {
    strBytes := []byte(str)
    byteReader := bytes.NewReader(strBytes)
    reader, _ := charset.NewReaderLabel(origEncoding, byteReader)
    strBytes, _ = ioutil.ReadAll(reader)
    return string(strBytes)
}

答案 2 :(得分:0)

我找到了一个更好的包,它使用了iconv。用法很简单,文档中对此进行了描述。例如:

output,_ := iconv.ConvertString("Hello World!", "windows-1252", "utf-8")

指向包裹的链接:https://github.com/djimenez/iconv-go

答案 3 :(得分:0)

2020年,我发现https://pkg.go.dev/mod/golang.org/x/text对我来说很好。

<div class="wrapper">
  <div class="element">
  Element
  </div>
  <div class="results"></div>

  <div class="buttons">
    <button class="clone">clone</button>
    <button class="remove">remove</button>
  </div>
</div>

https://play.golang.org/p/Hl7r146UwhT