如何转换 HTML 标签中的转义字符?
How to convert escape characters in HTML tags?
如何直接将"\u003chtml\u003e"
转换为"<html>"
?使用 json.Marshal()
将 "<html>"
转换为 "\u003chtml\u003e"
非常容易,但是 json.Unmarshal()
相当冗长和繁琐。在 golang 中有直接的方法吗?
您可以使用 strconv.Unquote()
进行转换。
您应该注意的一件事是 strconv.Unquote()
只能取消引号中的字符串(例如,以引号字符 "
或反引号字符 [=20= 开始和结束) ]), 所以我们必须手动附加它。
示例:
// 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
包。引用其文档:
Package html provides functions for escaping and unescaping HTML text.
但是 html
包(特别是 html.UnescapeString()
)不解码 \uxxxx
形式的 unicode 序列,只解码 &#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>
我认为这是一个普遍的问题。这就是我的工作方式。
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-
希望这对某人有所帮助。
如何直接将"\u003chtml\u003e"
转换为"<html>"
?使用 json.Marshal()
将 "<html>"
转换为 "\u003chtml\u003e"
非常容易,但是 json.Unmarshal()
相当冗长和繁琐。在 golang 中有直接的方法吗?
您可以使用 strconv.Unquote()
进行转换。
您应该注意的一件事是 strconv.Unquote()
只能取消引号中的字符串(例如,以引号字符 "
或反引号字符 [=20= 开始和结束) ]), 所以我们必须手动附加它。
示例:
// 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
包。引用其文档:
Package html provides functions for escaping and unescaping HTML text.
但是 html
包(特别是 html.UnescapeString()
)不解码 \uxxxx
形式的 unicode 序列,只解码 &#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>
我认为这是一个普遍的问题。这就是我的工作方式。
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-
希望这对某人有所帮助。