举个例子:
func main() {
buf := new(bytes.Buffer)
enc := json.NewEncoder(buf)
toEncode := []string{"hello", "wörld"}
enc.Encode(toEncode)
fmt.Println(buf.String())
}
字符串
我想让输出显示转义的Unicode字符:
[“hello”,“w\u00f6rld”]
而不是:
[“hello”,“wörld”]
我尝试编写一个函数,使用strconv.QuoteToASCII
引用Unicode字符,并将结果提供给Encode()
,但这会导致双重转义:
func quotedUnicode(data []string) []string {
for index, element := range data {
quotedUnicode := strconv.QuoteToASCII(element)
// get rid of additional quotes
quotedUnicode = strings.TrimSuffix(quotedUnicode, "\"")
quotedUnicode = strings.TrimPrefix(quotedUnicode, "\"")
data[index] = quotedUnicode
}
return data
}
型
[“hello”,“w\u00f6rld”]
如何确保json.Encode的输出包含正确转义的Unicode字符?
1条答案
按热度按时间xj3cbfub1#
encoding/json
软件包不支持此功能,但您可以自己实现它。对于结构体的每个字符串字段,将其类型从
string
更改为json.RawMessage
,并使用以下函数将其引用:字符串
完整示例:
型
Go playground:https://go.dev/play/p/Jk6GZwdvyvm
有些人建议使用
strconv.QuoteToASCII
,但这有两个问题:1.字符串在被封送时将被双转义,例如,它们看起来像
"\\u4e09"
而不是"\u4e09"
。"😊"
应编码为"\ud83d\ude0a"
而不是"\U0001f60a"
。