json \u选项,而不是Unicode替换

63lcw9qa  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(126)

如果我运行下面的代码:

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字符串而不是替换?

fslejnso

fslejnso1#

'\xa1'在Python中是一个有效的Unicode字符串,它只是一种可能的表示形式,如'\u00a1''\U000000a1'chr(0xa1)'\N{INVERTED EXCLAMATION MARK}''¡'或...
Python代码中的等效项为:

>>> print(json.dumps(b'\xa1'.decode(errors='replace')))
"\ufffd"

它也在stdout上输出强制REPLACEMENT CHARACTER的ascii表示,和Go语言中的一样。

piwo6bdm

piwo6bdm2#

这是因为"\xa1"不是一个有效的Unicode字符串。它包含的字节0xa1是无效的(本身无效)。无效的字节被替换为U+FFFD,这是“替换字符”-当输入无效时使用。
如果要对Unicode字符U+00 A1进行编码,则将其写为"\u00a1"。如果要使任意数据在JSON中往返,则必须用不同的方式表示(例如,用base64编码)。
Python的工作方式不同--在Python中,\xa1转义序列是U+00 A1。同样,在Go语言中,\xa1是字节0xa1,它本身不是有效的Unicode字符串,不能编码为JSON字符串。

相关问题