Mongodb 在Go中将任何编码转换为UTF 8
我正在通过IMAP下载消息。接下来,我将把解析后的消息添加到MongoDB中。我有一个问题,因为MongoDB只支持UTF8。我想把任何编码转换成UTF8。代码是多种多样的。如何将每个字符串转换为UTF 8Mongodb 在Go中将任何编码转换为UTF 8,mongodb,encoding,utf-8,go,Mongodb,Encoding,Utf 8,Go,我正在通过IMAP下载消息。接下来,我将把解析后的消息添加到MongoDB中。我有一个问题,因为MongoDB只支持UTF8。我想把任何编码转换成UTF8。代码是多种多样的。如何将每个字符串转换为UTF 8 我知道,我可以转换成二进制,但我必须有普通文本,因为我必须在数据库中搜索短语。除非,否则我可以用二进制搜索普通文本吗?我正在使用go charset项目执行此操作: 这非常简单,您可以从一个字符集创建一个读卡器,它会自动转换为utf-8。库中的示例: r, err := charset.Ne
我知道,我可以转换成二进制,但我必须有普通文本,因为我必须在数据库中搜索短语。除非,否则我可以用二进制搜索普通文本吗?我正在使用
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é
现在,在我的例子中,我知道字符集,因为它来自web页面,我阅读标题/元标记。如果需要通过启发式自动检测字符集,则需要另一个库,例如:
我没有使用过它,但它看起来也很简单:
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)
}
我发现了一个更好的软件包,它使用iconv。用法很简单,文档中对此进行了描述。例如:
output,_ := iconv.ConvertString("Hello World!", "windows-1252", "utf-8")
链接到包:
charset.NewReader
在包golang.org/x/net/html/charset
中无法处理编码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)
}
2020年,我发现这对我很有效
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é
}
为什么这比两年前要好。也许这个包裹现在更好了。