英文:
Subject encoded email (RFC2047). Decodes wrong
问题
我正在使用Golang编写应用程序。我需要解码电子邮件主题。
原始主题:
> Raport z eksportu ogłoszeń nieruchomości
编码主题:
=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?= =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?=^M
解码后的主题为:"Raport z eksportu ogłosze▒ ▒ nieruchomości"
我使用github.com/famz/RFC2047来解码电子邮件主题。
我的代码很简单:
RFC2047.Decode(msg.Header.Get("Subject"))
为什么解码后的主题会出现乱码?其他主题都可以正确解码。这是一个错误的编码主题吗?
英文:
I'm writing app in Golang. I need to decode email subject.
Original subject:
> Raport z eksportu ogłoszeń nieruchomości
Encoded subject:
=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?= =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?=^M
Decoded subject: "Raport z eksportu ogłosze▒ ▒ nieruchomości"
I use github.com/famz/RFC2047 to decode email subjects.
My code is simple:
RFC2047.Decode(msg.Header.Get("Subject"))
Why, after decoding the subject is broken? Other subjects are correctly decoded. Is this a bad encoded subject?
答案1
得分: 6
这个主题的编码有误。
它被分成了两个MIME编码的单词(因为编码行超过76个字符),但它在ń
字符的中间被分割。
如果将这两部分合并成一个编码字符串,你就能得到原始的主题:
s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXFhCBuaWVydWNob21vxZtjaQ==?="
fmt.Println(RFC2047.Decode(s))
// Dom.eu - raport z eksportu ogłoszeń nieruchomości
英文:
That subject is incorrectly encoded.
It was broken into two MIME encoded-words (because the encoded line would be longer than 76 characters), but it was split in the middle of the ń
character.
If you join the two parts into a single encoded string, you get back the original subject:
s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXFhCBuaWVydWNob21vxZtjaQ==?="
fmt.Println(RFC2047.Decode(s))
// Dom.eu - raport z eksportu ogłoszeń nieruchomości
答案2
得分: 4
如果您使用的是Go 1.5版本,您可以使用mime包的新函数。
如果您使用的是较旧版本的Go,您可以使用我的替代方案。
示例代码:
package main
import (
"fmt"
"mime" // 当使用Go 1.5时
mime "gopkg.in/alexcesaro/quotedprintable.v3" // 当使用较旧的Go版本时
)
func main() {
s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?= =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?="
dec := new(mime.WordDecoder)
subject, err := dec.DecodeHeader(s)
if err != nil {
panic(err)
}
fmt.Println(subject)
// 输出:
// Dom.eu - raport z eksportu ogłoszeń nieruchomości
}
英文:
If you're using Go 1.5, you can use the new functions of the mime package.
If you're using an older version of Go, you can use my drop-in replacement.
Example:
package main
import (
"fmt"
"mime" // When using Go 1.5
mime "gopkg.in/alexcesaro/quotedprintable.v3" // When using older Go versions
)
func main() {
s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXF?= =?utf-8?B?hCBuaWVydWNob21vxZtjaQ==?="
dec := new(mime.WordDecoder)
subject, err := dec.DecodeHeader(s)
if err != nil {
panic(err)
}
fmt.Println(subject)
// Output:
// Dom.eu - raport z eksportu ogłoszeń nieruchomości
}
答案3
得分: 0
在空闲时间里,我写了这个函数。该函数将字符串的各个部分连接起来并返回一个字符串。
func parseSubject(s string) string {
patternType := regexp.MustCompile(`(?i)=\?.*?\?.*?\?`)
resType := patternType.FindString(s)
if resType == "" {
return s
} else {
pattern := regexp.MustCompile(`(?i)=\?.*?\?.*?\?|\s+|\?=`)
res := pattern.ReplaceAllLiteral([]byte(s), []byte(""))
return resType + string(res) + "?="
}
}
请注意,这是一个Go语言的函数,用于处理字符串。它使用正则表达式来查找并替换特定的模式。具体而言,它查找以"=?"开头、以"?"结尾的子字符串,并将其替换为空字符串。最后,它将结果与原始字符串的开头和结尾连接起来,并返回最终的字符串。
英文:
In free time I wrote this function. The function joins parts of string and return one string.
func parseSubject(s string) string {
patternType := regexp.MustCompile("(?i)=\\?.*?\\?.*?\\?")
resType := patternType.FindString(s)
if resType == "" {
return s
} else {
pattern := regexp.MustCompile("(?i)=\\?.*?\\?.*?\\?|\\s+|\\?=")
res := pattern.ReplaceAllLiteral([]byte(s), []byte(""))
return resType + string(res) + "?="
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论