email - 在 Golang 中解码引用可打印的电子邮件

标签 email go unicode utf-8 html-email

当您在 Gmail 的 html 电子邮件中连续键入两个空格时,如果您查看电子邮件的来源,它会将其编码为可引用的可打印正文“=C2=A0”。

根据这个 stackoverflow 答案,由于 UTF-8 编码,解码时应将其转换为 00A0 (n​​bsp):https://stackoverflow.com/a/2774507

但是,在 Golang 中,这不是它的工作方式:

s := `Text Text Text.=C2=A0 That's just two spaces`

r := strings.NewReader(s)

qpReader := quotedprintable.NewReader(r)

all, _ := ioutil.ReadAll(qpReader)

str := string(all)

fmt.Println(strings.Index(str, "\xC2\xA0"))

这会输出“15”,这是 Playground 链接:https://play.golang.org/p/8n6L7dlZPt

它不会在那里使用 NBSP,而是保留\xC2 并生成“Text Text Text That's just two spaces”。

将其正确呈现为\x00A0 的最佳方法是什么?

最佳答案

正如 Volker 在他的评论中所解释的那样,Go 字符串只是一个 byte slice 段。在您的情况下,它已经编码为 UTF-8,这是 Go 的默认编码。要访问实际的 Unicode 代码点(Go 术语中的 runes),请使用如下内容:

// Prints 15.
fmt.Println(strings.IndexRune(str, '\xA0'))

// Prints A0.
fmt.Printf("%X\n", []rune(str)[15]);

如何正确呈现字符串取决于您要呈现它的位置。但在大多数情况下,您可以按原样传递它,因为它已经是 UTF-8 格式了。

关于email - 在 Golang 中解码引用可打印的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905551/

相关文章:

windows - 使用 Indy 组件发送电子邮件

ruby-on-rails - Griddler 配置未定义的方法 processor_class

go - 为什么 Go 不能正确地杀死一个子进程?

go - Colly 找不到任何链接

string - 使用字符串键和字符串或 slice 值进行映射?

ajax - 如何通过 Ajax 或 CGI 获取 Perl Unicode 字符串输入的长度?

无法停止使用 !feof() 读取 Unicode 文件

C# html 电子邮件 - Div/文本覆盖图像

email - 用户名,密码和电子邮件的标准最小和最大长度是多少?

python - 如何在Python中调用raw_input()正确显示中文字符串?