我们发现了一个问题,一些表情符号有两个utf-8代码,例如:
emoji unicode utf-8 another utf-8 U+1F601 \xf0\x9f\x98\x81 \xed\xa0\xbd\xed\xb8\x81
但是ios语言无法解码其他类型的utf-8,因此当我从utf-8解码字符串时会产生错误.
在我找到的所有文档中,我只能为表情符号找到一种类型的utf-8代码,无处找到另一种代码.
我引用的文件包括:
表情符号代码链接
整个utf-8代码链接
但是在web工具bianma中,所有两种类型的utf-8代码都可以正确转换为表情符号.
所以,我的问题是:
为什么一个表情符号有两种类型的utf-8代码?
哪个文件包含两种类型的utf-8代码?
如何使用ios语言中的NSString正确转换utf-8中的字符串?
bobince.. 12
0xF0,0x9F,0x98,0x81
是否为U + 1F601的正确UTF-8编码.
0xED,0xA0,0xBD,0xED,0xB8,0x81
不是有效的UTF-8序列(*).它应该被拒绝; iOS是正确的.
这是bianma工具中的一个错误:该convertUtf8BytesToUnicodeCodePoints
函数对于它接受的输入比例如RFC 3629中的指定算法更宽松.
这恰好返回一个工作字符串,因为该工具是用JavaScript编写的.已经解码的上述字节序列与伪代理码点序列U + D83D,U + DE01它然后转换该成JavaScript字符串使用直接码点到代码单元映射给予\uD83D\xDE01
.由于这是以UTF-16字符串编码的正确方法,因此它似乎有效.
(*:它是一个有效的CESU-8序列,但是这种编码只是"与编写错误的历史工具兼容的伪造破坏编码",通常应该避免.)
你不应该经常遇到这样的序列; 它通常不值得用餐,除非你有这种格式错误的数据的特定来源,你没有权力得到修复.
0xF0,0x9F,0x98,0x81
是否为U + 1F601的正确UTF-8编码.
0xED,0xA0,0xBD,0xED,0xB8,0x81
不是有效的UTF-8序列(*).它应该被拒绝; iOS是正确的.
这是bianma工具中的一个错误:该convertUtf8BytesToUnicodeCodePoints
函数对于它接受的输入比例如RFC 3629中的指定算法更宽松.
这恰好返回一个工作字符串,因为该工具是用JavaScript编写的.已经解码的上述字节序列与伪代理码点序列U + D83D,U + DE01它然后转换该成JavaScript字符串使用直接码点到代码单元映射给予\uD83D\xDE01
.由于这是以UTF-16字符串编码的正确方法,因此它似乎有效.
(*:它是一个有效的CESU-8序列,但是这种编码只是"与编写错误的历史工具兼容的伪造破坏编码",通常应该避免.)
你不应该经常遇到这样的序列; 它通常不值得用餐,除非你有这种格式错误的数据的特定来源,你没有权力得到修复.