亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

電子郵件主題、不同字符集的標頭解碼,如 ISO-2022-JP、GB-2312 等

電子郵件主題、不同字符集的標頭解碼,如 ISO-2022-JP、GB-2312 等

Go
皈依舞 2021-12-07 16:49:00
我正在開發一個需要處理不同字符集的電子郵件編碼/解碼的項目。一個python代碼可以如下所示:from email.header import Header, decode_header, make_headerfrom charset import text_to_utf8    class ....def decode_header(self, header):    decoded_header = decode_header(header)    if decoded_header[0][1] is None:        return text_to_utf8(decoded_header[0][0]).decode("utf-8", "replace")    else:        return decoded_header[0][0].decode(decoded_header[0][1].replace("windows-", "cp"), "replace")基本上,對于像 "=?iso-2022-jp?b?GyRCRW1CQE86GyhCIDxtb21vQHRhcm8ubmUuanA=?="; “decode_header”函數只是試圖找到編碼:'iso-2022-jp';然后它將使用“解碼”函數將字符集解碼為 unicode?,F在,在 Go 中,我可以做類似的事情:import "mime"dec := new(mime.WordDecoder)text := "=?utf-8?q?=C3=89ric?= <[email protected]>, =?utf-8?q?Ana=C3=AFs?= <[email protected]>"header, err := dec.DecodeHeader(text)Seems that there mime.WordDecoder allow to put a charset decoder "hook": type WordDecoder struct {   // CharsetReader, if non-nil, defines a function to generate   // charset-conversion readers, converting from the provided   // charset into UTF-8.   // Charsets are always lower-case. utf-8, iso-8859-1 and us-ascii charsets   // are handled by default.   // One of the the CharsetReader's result values must be non-nil.   CharsetReader func(charset string, input io.Reader) (io.Reader, error)}           我想知道是否有任何庫可以讓我轉換任意字符集,如 python 中的“解碼”函數,如上例所示。我不想寫一個像 mime/encodedword.go 中使用的那樣的大“開關案例”:func (d *WordDecoder) convert(buf *bytes.Buffer, charset string, content []byte) error {   switch {   case strings.EqualFold("utf-8", charset):      buf.Write(content)   case strings.EqualFold("iso-8859-1", charset):      for _, c := range content {         buf.WriteRune(rune(c))      }....任何幫助將不勝感激。
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

似乎 golang.org/x/net/html/charset 包已經提供了一個帶有可用編碼的地圖。以下代碼對我有用:


import "golang.org/x/net/html/charset"


CharsetReader := func (label string, input io.Reader) (io.Reader, error) {

    label = strings.Replace(label, "windows-", "cp", -1)

    encoding, _ := charset.Lookup(label)

    return encoding.NewDecoder().Reader(input), nil

}

dec := mime.WordDecoder{CharsetReader: CharsetReader}

text := "=?iso-2022-jp?b?GyRCRW1CQE86GyhCIDxtb21vQHRhcm8ubmUuanA=?="

header, err := dec.DecodeHeader(text)

謝謝你的幫助!


查看完整回答
反對 回復 2021-12-07
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

我不確定這是否是您要查找的內容,但是golang.org/x/text我正在使用該軟件包將 Windows-1251 轉換為 UTF-8。代碼看起來像


import (

    "golang.org/x/text/encoding/charmap"

    "golang.org/x/text/transform"

    "io/ioutil"

    "strings"

)


func convert(s string) string {

    sr := strings.NewReader(s)

    tr := transform.NewReader(sr, charmap.Windows1251.NewDecoder())

    buf, err := ioutil.ReadAll(tr)

    if err != nil {

        return ""

    }

    return string(buf)

}

我認為在你的情況下,如果你想避免“一個大的'switch-case'”,你可以創建一種帶有可用編碼完整列表的地圖,然后制作類似的東西:


var encodings = map[string]transform.Transformer{

    "win-1251": charmap.Windows1251.NewDecoder(),

}


func convert(s, charset string) string {

    buf, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(s), encodings[charset]))

    if err != nil {

        return ""

    }

    return string(buf)

}


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號