由于表情符号,Go正在JSON输出中生成未转义的控制字符

我在Go中遇到了麻烦,我不确定在哪里看.我从
MySQL数据库中获取UTF-8字符串,并尝试将其返回给客户端的JSON响应.

不同的客户端反应不同,但iOS NSJSONSerialization返回“未转义的控制字符”错误.这打破了整个应用程序.不过,我可以使用JSON.parse()在Chrome中解决JSON问题而不会出现问题.

在服务器端,除了Go之外用另一种语言编写的这个相同的生成器函数工作正常.救命?

编辑:这是导致问题的JSON:

{ "test":"☮️" }

…如果我省略这个表情符号,它就可以了.如果它在那里,它不起作用.这个问题似乎与某些表情符号有两种不同的编码有关.一个似乎绊倒Go,但它们都是有效的.

为了演示编码的差异,一些表情符号出现在数据库资源管理器中,有些不表示:

《由于表情符号,Go正在JSON输出中生成未转义的控制字符》

…出现在数据库资源管理器中的这些问题导致此问题具有100%的可重现性.但是,所有这些通常都出现在实际的客户端软件(而不是数据库浏览器)中而没有问题.我不知道是否有办法重新配置数据库连接以避免这种情况(或某些东西),但它似乎适用于不同的实例,具体取决于解码的内容以及它的宽容程度.考虑到用户可以键入或复制/粘贴任一编码…这需要一致地工作.

任何帮助,将不胜感激.提前致谢.

最佳答案 去做得很好.

fmt.Println([]byte("☮️"))
//[226 152 174 239 184 143]
//Yup, 1 character - 6 bytes.

NSJSONSerialization无法处理这个问题.可能是这个链接会有所帮助
NSJSONSerialization and Emoji.这是关于NSData * utf32Data = [uniText dataUsingEncoding:NSUTF32LittleEndianStringEncoding] ;.胡说

你可以在“iOS风格”中给我们“☮️”simbol的字节表示,就像我用go一样吗?

UPD

我做了一些研究,看起来你的数据库编码有问题.是UTF16吗?

看一下这个

// it look the same, but completely different "characters"
//first one is yours, and second one is U+262E
const nihongo = "☮️☮"
for index, runeValue := range nihongo {
        fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
}
bad := []byte("☮️")
good := []byte("☮")
fmt.Printf("%v %s \n", bad, bad)
fmt.Printf("%v %s \n", good, good)

输出:

U+262E '☮' starts at byte position 0
U+FE0F '️' starts at byte position 3
U+262E '☮' starts at byte position 6
[226 152 174 239 184 143] ☮️ 
[226 152 174] ☮ 

UDP2

它只是打我!我一直用你的符号做ctrl c / ctrl v.但它不是一个单一的符号!它的2个符号和第二个符号是不可打印的.

unprintable := []byte{239, 184, 143}
fmt.Printf("valid? %v", utf8.Valid(unprintable))
fmt.Println("full rune?", utf8.FullRune(unprintable))
r, size := utf8.DecodeRune(unprintable)
fmt.Println(r, size, string(r))
fmt.Printf("valid rune? #v", utf8.ValidRune(r))

输出:

valid? true
full rune? true
65039 3 ️
valid rune? true

所以,你的数据库很好,不可打印的“字符”很好,但NSJSONSerialization无法处理它.最好问iOS社区=)

点赞