在 Golang 中解码引用可打印的电子邮件
Decoding quoted-printable email in Golang
当您在 Gmail 的 html 电子邮件中连续键入两个空格时,如果您查看电子邮件的来源,它会将其编码为可引用的可打印正文“=C2=A0”。
根据这个 Whosebug 答案,由于 UTF-8 编码,解码时应将其转换为 00A0 (nbsp):
然而,在 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 link:https://play.golang.org/p/8n6L7dlZPt
它不会在那里使用 NBSP,而是保留 \xC2 并导致 "Text Text Text That's just two spaces"。
将其正确呈现为 \x00A0 的最佳方法是什么?
正如 Volker 在他的评论中所解释的那样,Go 字符串只是一个字节片段。在您的情况下,它已经编码为 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 格式了。
当您在 Gmail 的 html 电子邮件中连续键入两个空格时,如果您查看电子邮件的来源,它会将其编码为可引用的可打印正文“=C2=A0”。
根据这个 Whosebug 答案,由于 UTF-8 编码,解码时应将其转换为 00A0 (nbsp):
然而,在 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 link:https://play.golang.org/p/8n6L7dlZPt
它不会在那里使用 NBSP,而是保留 \xC2 并导致 "Text Text Text That's just two spaces"。
将其正确呈现为 \x00A0 的最佳方法是什么?
正如 Volker 在他的评论中所解释的那样,Go 字符串只是一个字节片段。在您的情况下,它已经编码为 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 格式了。