2016-04-10 9 views
1

Wie können wir "\u003chtml\u003e" direkt in "<html>" konvertieren? Die Umwandlung von "<html>" zu "\u003chtml\u003e" ist ziemlich einfach unter Verwendung von json.Marshal(), aber json.Unmarshal() ist ziemlich lang und umständlich. Gibt es einen direkten Weg, dies in Golang zu tun?Wie wandeln Sie Escape-Zeichen in HTML-Tags um?

Antwort

2

Sie können die strconv.Unquote() verwenden, um die Konvertierung durchzuführen.

Eine Sache, die Sie beachten sollten, ist, dass strconv.Unquote() kann nur unquote Zeichenfolgen, die in Anführungszeichen gesetzt sind (zum Beispiel mit einem Zitat char beginnen und enden " oder zurück Gänsefüsschen `), so haben wir, dass manuell anhängen.

Beispiel:

// Important to use backtick ` (raw string literal) 
// else the compiler will unquote it (interpreted string literal)! 

s := `\u003chtml\u003e` 
fmt.Println(s) 
s2, err := strconv.Unquote(`"` + s + `"`) 
if err != nil { 
    panic(err) 
} 
fmt.Println(s2) 

Output (versuchen Sie es auf dem Go Playground):

\u003chtml\u003e 
<html> 

Hinweis: HTML Text zu tun und URL-Kodierung zu entkommen, können Sie das html Paket verwenden . Zitieren seiner doc:

Paket html bietet Funktionen zum Entkommen und Unerledigungs HTML-Text.

Aber die html Paket (speziell html.UnescapeString()) nicht dekodieren nicht Unicode-Sequenzen der Form \uxxxx, nur &#decimal; oder &#xHH;.

Beispiel:

fmt.Println(html.UnescapeString(`\u003chtml\u003e`)) // wrong 
fmt.Println(html.UnescapeString(`&#60;html&#62;`)) // good 
fmt.Println(html.UnescapeString(`&#x3c;html&#x3e;`)) // good 

Output (versuchen Sie es auf dem Go Playground):

\u003chtml\u003e 
<html> 
<html> 

Hinweis # 2:

Sie sollten auch beachten, dass, wenn Sie schreiben ein Code wie dieser:

s := "\u003chtml\u003e" 

Diese zitierte Zeichenfolge wird vom Compiler selbst unquoted werden, da es eine interpretiert Stringliteral ist, so dass Sie nicht wirklich testen können. Um Zeichenfolge in Anführungszeichen in der Quelle angeben, können Sie die Graviszeichen verwenden, um ein roher Stringliteral angeben oder Sie können einen doppelten Anführungszeichen interpretiert Stringliteral verwenden:

s := "\u003chtml\u003e" // Interpreted string literal (unquoted by the compiler!) 
fmt.Println(s) 

s2 := `\u003chtml\u003e` // Raw string literal (no unquoting will take place) 
fmt.Println(s2) 

s3 := "\\u003chtml\\u003e" // Double quoted interpreted string literal 
          // (unquoted by the compiler to be "single" quoted) 
fmt.Println(s3) 

Ausgang:

<html> 
\u003chtml\u003e 
+0

Danke lieber Herr! Du bist toll! :) –

0

Sie können das Zeichenfolgenformatierungspaket fmt für diesen Bereich verwenden.

fmt.Printf("%v","\u003chtml\u003e") // will output <html> 

https://play.golang.org/p/ZEot6bxO1H

+0

Eigentlich ist '" \ u003chtml \ u003e "' vom Compiler nicht quoted, nicht vom 'fmt' Paket. Sie werden es sehen, wenn Sie es mit dem Backtick versuchen: ' – icza