为了账号安全,请及时绑定邮箱和手机立即绑定

如何转换 HTML 标签中的转义字符?

如何转换 HTML 标签中的转义字符?

Go
胡说叔叔 2022-01-04 10:34:07
我们如何直接转换"\u003chtml\u003e"为"<html>"?使用 转换"<html>"to"\u003chtml\u003e"很容易json.Marshal(),但json.Unmarshal()相当冗长和繁琐。在 golang 中有没有直接的方法可以做到这一点?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

您可以使用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


查看完整回答
反对 回复 2022-01-04
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我认为这是一个普遍的问题。这就是我让它工作的方式。


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-


希望这可以帮助某人。


查看完整回答
反对 回复 2022-01-04
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您可以fmt为此范围使用字符串格式化包。

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

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


查看完整回答
反对 回复 2022-01-04
  • 3 回答
  • 0 关注
  • 548 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信