Как мы можем напрямую преобразовать "\u003chtml\u003e"
в "<html>"
? Преобразование "<html>"
в "\u003chtml\u003e"
довольно просто с помощью json.Marshal()
, но json.Unmarshal()
довольно длинное и громоздкое. Есть ли прямой способ сделать это в golang?
Как преобразовать escape-символы в теги HTML?
Ответы (3)
Вы можете использовать strconv.Unquote()
для преобразования.
Одна вещь, о которой вы должны знать, это то, что strconv.Unquote()
может раскавычивать только строки, которые находятся в кавычках (например, начинаются и заканчиваются символом кавычки "
или символом обратной кавычки `
), поэтому мы должны добавить это вручную.
Пример:
// 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)
Результат (попробуйте на Go Playground):
\u003chtml\u003e
<html>
Примечание. Для экранирования и восстановления HTML-текста можно использовать html
. упаковка. Цитируя свой документ:
Пакет html предоставляет функции для экранирования и восстановления HTML-текста.
Но пакет html
(в частности, html.UnescapeString()
) не декодирует последовательности Unicode формы \uxxxx
, только &#decimal;
или &#xHH;
.
Пример:
fmt.Println(html.UnescapeString(`\u003chtml\u003e`)) // wrong
fmt.Println(html.UnescapeString(`<html>`)) // good
fmt.Println(html.UnescapeString(`<html>`)) // good
Результат (попробуйте на Go Playground):
\u003chtml\u003e
<html>
<html>
Примечание 2.
Вы также должны отметить, что если вы напишете такой код:
s := "\u003chtml\u003e"
Эта строка в кавычках не будет заключена в кавычки самим компилятором, так как это интерпретируемый строковый литерал, так что вы не сможете это проверить. Чтобы указать строку в кавычках в источнике, вы можете использовать обратную кавычку, чтобы указать необработанный строковый литерал, или вы можете использовать двойные кавычки, интерпретируемый строковый литерал:
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)
Выход:
<html>
\u003chtml\u003e
Для этой области можно использовать пакет форматирования строк fmt
.
fmt.Printf("%v","\u003chtml\u003e") // will output <html>
https://play.golang.org/p/ZEot6bxO1H
"\u003chtml\u003e"
не заключен в кавычки компилятором, а не пакетом fmt
. Вы увидите это, если попробуете с обратной кавычкой: `
- person icza; 10.04.2016
Я думаю, что это общая проблема. Вот как я заставляю это работать.
func _UnescapeUnicodeCharactersInJSON(_jsonRaw json.RawMessage) (json.RawMessage, error) {
str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(_jsonRaw)), `\\u`, `\u`, -1))
if err != nil {
return nil, err
}
return []byte(str), nil
}
func main() {
// Both are valid JSON.
var jsonRawEscaped json.RawMessage // json raw with escaped unicode chars
var jsonRawUnescaped json.RawMessage // json raw with unescaped unicode chars
// '\u263a' == '☺'
jsonRawEscaped = []byte(`{"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}`) // "\\u263a"
jsonRawUnescaped, _ = _UnescapeUnicodeCharactersInJSON(jsonRawEscaped) // "☺"
fmt.Println(string(jsonRawEscaped)) // {"HelloWorld": "\uC548\uB155, \uC138\uC0C1(\u4E16\u4E0A). \u263a"}
fmt.Println(string(jsonRawUnescaped)) // {"HelloWorld": "안녕, 세상(世上). ☺"}
}
https://play.golang.org/p/pUsrzrrcDG-
Надеюсь, это поможет кому-то.