如果我运行下面的代码:
package main
import (
"encoding/json"
"os"
)
func main() {
json.NewEncoder(os.Stdout).Encode("\xa1") // "\ufffd"
}
我丢失了数据,因为一旦Unicode替换完成,我就再也不能恢复原始值了。
import json
a = '\xa1'
b = json.dumps(a) # "\u00a1"
print(json.loads(b) == a) # True
没有替换,所以没有数据丢失。2另外,结果JSON仍然是有效的。3 Go语言是否有一些方法可以用转义来编码JSON字符串而不是替换?
2条答案
按热度按时间fslejnso1#
'\xa1'
在Python中是一个有效的Unicode字符串,它只是一种可能的表示形式,如'\u00a1'
或'\U000000a1'
或chr(0xa1)
或'\N{INVERTED EXCLAMATION MARK}'
或'¡'
或...Python代码中的等效项为:
它也在stdout上输出强制REPLACEMENT CHARACTER的ascii表示,和Go语言中的一样。
piwo6bdm2#
这是因为
"\xa1"
不是一个有效的Unicode字符串。它包含的字节0xa1
是无效的(本身无效)。无效的字节被替换为U+FFFD,这是“替换字符”-当输入无效时使用。如果要对Unicode字符U+00 A1进行编码,则将其写为
"\u00a1"
。如果要使任意数据在JSON中往返,则必须用不同的方式表示(例如,用base64编码)。Python的工作方式不同--在Python中,
\xa1
转义序列是U+00 A1。同样,在Go语言中,\xa1
是字节0xa1
,它本身不是有效的Unicode字符串,不能编码为JSON字符串。