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

11

我正在通过IMAP下载邮件。然后我将解析出来的邮件添加到MongoDB中。但是我遇到了一个问题,因为MongoDB只支持UTF 8编码。而不同邮件的编码是各种各样的。那么我该如何将所有编码转换为UTF 8编码呢?

我知道可以将编码转换为二进制,但是我需要普通文本,因为我要在数据库中搜索短语。除非,在二进制中可以搜索普通文本吗?

4个回答

11
我将使用"go-charset"项目来完成这项任务:https://code.google.com/p/go-charset/ 它非常简单,您只需从字符集创建一个读取器,它会自动翻译为UTF-8。以下是该库中的示例:
r, err := charset.NewReader(strings.NewReader("\xa35 for Pepp\xe9"), "latin1")
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é

现在,在我的情况下,我知道字符集是因为它来自网页并且我读取了头文件/元标记。如果您需要通过启发式自动检测字符集,则需要另一个库,例如这个: 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)
}

6

2020年,我发现https://pkg.go.dev/mod/golang.org/x/text 这个资源对我很有用。

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"

    "golang.org/x/text/encoding/ianaindex"
    "golang.org/x/text/transform"
)

func main() {
    text := "\xa35 for Pepp\xe9"
    charset := "latin1"
    e, err := ianaindex.MIME.Encoding(charset)
    if err != nil {
        log.Fatal(err)
    }
    r := transform.NewReader(bytes.NewBufferString(text), e.NewDecoder())
    result, err := ioutil.ReadAll(r)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s\n", result) //outputs £5 for Peppé
}

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


5
在包golang.org/x/net/html/charset中,charset.NewReader 无法处理编码为gb2312的情况。但是charset.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)
}

1

我找到了一个更好的包,它使用iconv。使用方法很简单,文档中有详细说明。例如:

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

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


为什么这比https://godoc.org/golang.org/x/net/html/charset更好? - user776942
那是两年前的事了。也许现在这个包更好了。 - JakubKubera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接