func ExampleWordDecoder_Decode() { dec := new(mime.WordDecoder) header, err := dec.Decode("=?utf-8?q?=C2=A1Hola,_se=C3=B1or!?=") if err != nil { panic(err) } fmt.Println(header) dec.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case "x-case": // Fake character set for example. // Real use would integrate with packages such // as code.google.com/p/go-charset content, err := ioutil.ReadAll(input) if err != nil { return nil, err } return bytes.NewReader(bytes.ToUpper(content)), nil default: return nil, fmt.Errorf("unhandled charset %q", charset) } } header, err = dec.Decode("=?x-case?q?hello!?=") if err != nil { panic(err) } fmt.Println(header) // Output: // ¡Hola, señor! // HELLO! }
// DecodeHeader (per RFC 2047) using Golang's mime.WordDecoder func DecodeHeader(input string) string { if !strings.Contains(input, "=?") { // Don't scan if there is nothing to do here return input } dec := new(mime.WordDecoder) dec.CharsetReader = NewCharsetReader header, err := dec.DecodeHeader(input) if err != nil { return input } return header }
// NonASCII Decode non ASCII header string RFC 1342 func NonASCII(encoded string) string { regexRFC1342, _ := regexp.Compile(`=\?.*?\?=`) dec := new(mime.WordDecoder) dec.CharsetReader = charset.NewReader result := regexRFC1342.ReplaceAllStringFunc(encoded, func(encoded string) string { decoded, err := dec.Decode(encoded) if err != nil { log.Println("Error decode NonASCII", encoded, err) return encoded } return decoded }) return result }
func WordDecoder() *mime.WordDecoder { decoder := new(mime.WordDecoder) decoder.CharsetReader = CharsetReader return decoder }