我正在转换一个解码电子邮件的 Go 程序。它目前运行 iconv 来进行实际解码,这当然有开销。我想使用golang.org/x/text/transform和golang.org/x/net/html/charset包来做到这一点。这是工作代码:
// cs is the charset that the email body is encoded with, pulled from
// the Content-Type declaration.
enc, name := charset.Lookup(cs)
if enc == nil {
log.Fatalf("Can't find %s", cs)
}
// body is the email body we're converting to utf-8
r := transform.NewReader(strings.NewReader(body), enc.NewDecoder())
// result contains the converted-to-utf8 email body
result, err := ioutil.ReadAll(r)
除非遇到非法字节,否则效果很好,不幸的是,这在野外处理电子邮件时并不少见。ioutil.ReadAll() 返回错误和所有转换的字节,直到出现问题。有没有办法告诉转换包忽略非法字节?现在,我们使用 -c 标志来 iconv 来做到这一点。我已经浏览了转换包的文档,但我不知道这是否可能。
更新: 这是一个显示问题的测试程序(Go 游乐场没有字符集或转换包......)。原始文本取自实际电子邮件。是的,它是英文的,是的,电子邮件中的字符集设置为 EUC-KR。我需要它来忽略那个撇号。
package main
import (
"io/ioutil"
"log"
"strings"
"golang.org/x/net/html/charset"
"golang.org/x/text/transform"
)
func main() {
raw := `So, at 64 kBps, or kilobits per second, you’re getting 8 kilobytes a second.`
enc, _ := charset.Lookup("euc-kr")
r := transform.NewReader(strings.NewReader(raw), enc.NewDecoder())
result, err := ioutil.ReadAll(r)
if err != nil {
log.Printf("ReadAll returned %s", err)
}
log.Printf("RESULT: '%s'", string(result))
}
湖上湖
互换的青春
相关分类