我们发现了一个问题,一些表情符号有两个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代码,无处找到另一种。
我引用的文件包括:
但是在网络工具bianma中,所有两种类型的utf-8代码都可以正确转换为表情符号。
所以,我的问题是:
为什么一个表情符号有两种类型的utf-8代码?
哪里有包含两种utf-8代码的文件?
如何使用ios语言中的NSString正确转换utf-8中的字符串?
答案 0 :(得分:11)
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序列,但是这种编码只是“与编写错误的历史工具兼容的伪造破坏编码”,通常应该避免。)
你通常不会遇到这样的序列;它通常不值得用餐,除非你有这种格式错误的数据的特定来源,你没有权力修复。
答案 1 :(得分:0)
这对我来说在php中用emoji向电报机发送消息:
$message_text = " \xf0\x9f\x98\x81 ";