由于表情符号

时间:2016-05-31 00:43:45

标签: json go unicode emoji utf8mb4

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

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

在服务器端,除了Go之外用另一种语言编写的相同生成器函数工作正常。帮助

编辑:以下是导致此问题的JSON:

{ "test":"☮️" }

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

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

screenshot

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

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:2)

Go做得很好。

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社区=)