我正在通过IMAP下载邮件。然后我将解析出来的邮件添加到MongoDB中。但是我遇到了一个问题,因为MongoDB只支持UTF 8编码。而不同邮件的编码是各种各样的。那么我该如何将所有编码转换为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é
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)
}
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é
}
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)
}
我找到了一个更好的包,它使用iconv。使用方法很简单,文档中有详细说明。例如:
output,_ := iconv.ConvertString("Hello World!", "windows-1252", "utf-8")