Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在Go中将任何编码转换为UTF 8_Mongodb_Encoding_Utf 8_Go - Fatal编程技术网

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

Mongodb 在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

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


我知道,我可以转换成二进制,但我必须有普通文本,因为我必须在数据库中搜索短语。除非,否则我可以用二进制搜索普通文本吗?

我正在使用
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é
}

为什么这比两年前要好。也许这个包裹现在更好了。