Как преобразовать escape-символы в теги HTML?

Как мы можем напрямую преобразовать "\u003chtml\u003e" в "<html>"? Преобразование "<html>" в "\u003chtml\u003e" довольно просто с помощью json.Marshal(), но json.Unmarshal() довольно длинное и громоздкое. Есть ли прямой способ сделать это в golang?


person Muhammad Umer    schedule 10.04.2016    source источник


Ответы (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(`&#60;html&#62;`))   // good
fmt.Println(html.UnescapeString(`&#x3c;html&#x3e;`)) // 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
person icza    schedule 10.04.2016
comment
Спасибо, добрый сэр! Ты обалденный! :) - person Muhammad Umer; 10.04.2016

Для этой области можно использовать пакет форматирования строк fmt.

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

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

person Endre Simo    schedule 10.04.2016
comment
На самом деле "\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-

Надеюсь, это поможет кому-то.

person Coconut    schedule 29.07.2018