2015-03-08 14 views
5

sto usando un'API e sta tornando qualcosa di simile per l'altro testo lingua "= UTF 8 ..?":Conversione (RFC 2047) per una stringa regolare golang

=?UTF 8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF 8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF 8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF 8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=

Is questo è un formato comune? Come farei a convertire questo in una stringa normale in golang?

Golang gestisce in genere più lingue, ma non sono sicuro di come procedere per la conversione.

risposta

6

A parte l'API restituisce i dati codificati in RFC 2047 format. Fondamentalmente, questo definisce quanto segue:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" 

Il che significa che il set di caratteri UTF-8 (molto utile, dato che questo è il set di caratteri nativo di Go), e la codifica Base64 è. Il testo che devi decodificare è quello tra "B"? e il "? =". Quindi tutto ciò che devi fare è prendere il testo e chiamare:

base64.StdEncoding.DecodeString(text) 

per ottenere la stringa UTF-8 originale.

V'è una funzione decodeRFC2047Word() nel pacchetto net/mail del stdlib Go, sostenendo codifiche B e Q e charsets UTF-8, US-ASCII e ISO-8859-1. Purtroppo non è esportato, ma siete liberi di prendere il più ispirazione da esso come necessario;)

BTW: ho appena notato il set di caratteri nel tuo esempio stringhe è UTF 8, che è un po 'strano, dal momento che la il nome ufficiale della codifica è UTF-8.

+0

E 'il trattino, è stato rimosso in uno dei miei passaggi di elaborazione. – John

+0

* erroneamente rimosso – John

2

Dal Go 1.5 è possibile utilizzare mime.WordDecoder.DecodeHeader:

package main 

import (
    "fmt" 
    "mime" 
) 

func main() { 
    dec := new(mime.WordDecoder) 
    header, err := dec.DecodeHeader("=?UTF-8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF-8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF-8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF-8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=") 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(header) 
    // Output: لخطوات التي تجمع بين حفظ القرآن الكريم وفهمه مما أملاه العلامة عبد الله الغديان.pdf 
} 

Se si utilizza una versione precedente di Go, è possibile utilizzare la mia libreria di sostituzione: https://github.com/alexcesaro/quotedprintable

Problemi correlati