主题编码电子邮件(RFC2047)。解码错误。

4

我正在使用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"))

为什么解码后主题会出现乱码?其他主题可以正确解码。这是一个糟糕的编码主题吗?


2
看起来好像是将一个UTF-8字符分成了两半。 - thwd
1
如何创建一个最小化、完整性和可验证的示例 - peterSO
3个回答

6

该主题编码不正确。 它被分成两个MIME编码的单词(因为编码行长度超过76个字符),但是它在ń字符的中间被分开了。

如果将两个部分组合成一个编码字符串,您将得到原始主题:

s := "=?utf-8?B?RG9tLmV1IC0gcmFwb3J0IHogZWtzcG9ydHUgb2fFgm9zemXFhCBuaWVydWNob21vxZtjaQ==?="
fmt.Println(RFC2047.Decode(s))

// Dom.eu - raport z eksportu ogłoszeń nieruchomości

@tomwilde:是的,我提到这就是为什么单词被分开的原因,尽管不正确。 - JimB
1
@tomwilde:哦,76个字符(78-CRLF)只是每行的建议。您可以跨多行折叠标题:请参见https://www.ietf.org/rfc/rfc2822.txt中的2.3.3节。 - JimB

4
如果您使用的是Go 1.5,您可以使用mime包的新函数。
如果您使用旧版本的Go,则可以使用我提供的替代方案
示例:
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
}

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) + "?="
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接