2014-12-04 51 views
1

我正在通過IMAP下載郵件。接下來,我將分析後的消息添加到MongoDB中。我遇到了一個問題,因爲MongoDB僅支持UTF 8.我想將任何編碼轉換爲UTF 8。代碼是各種各樣的。我怎樣才能將每個字符串轉換爲UTF 8?將任何編碼轉換爲UTF 8中的內容

我知道,我可以轉換爲二進制,但我必須有正常的文本,因爲我必須搜索數據庫中的短語。除非,我可以用二進制文件搜索普通文本嗎?如果是,請給我代碼轉換任何字符串爲二進制,請。

請幫忙。

回答

3

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

現在,在我的情況下,我知道字符集,因爲它來自網頁,我讀了標題/元標記。如果您需要通過啓發式自動檢測字符集,你需要爲另一個庫,比如這一個: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) 
} 
0

我發現了一個更好的包,它使用iconv。用法很簡單,它在文檔中有描述。例如:

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

鏈接到包:https://github.com/djimenez/iconv-go

+0

爲什麼這比https://godoc.org/golang.org/x/net/html/charset更好? – 2017-05-01 01:21:17

+0

兩年前。也許這個軟件包現在好多了。 – JakubKubera 2017-05-02 07:39:37

0

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) 
} 
相關問題