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

huangapple go评论75阅读模式
英文:

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

huangapple
  • 本文由 发表于 2014年10月23日 20:13:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/26527803.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定