为什么表情符号有两个不同的utf-8代码?如何从utf-8转换表情符号,在ios中使用NSString?

时间:2015-12-22 05:34:23

标签: ios unicode utf-8 nsstring emoji

我们发现了一个问题,一些表情符号有两个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解码字符串时会出错。

ios code

在我发现的所有文件中,我只能找到一种表情符号的utf-8代码,无处找到另一种。

我引用的文件包括:

emoji code link

whole utf-8 code link

但是在网络工具bianma中,所有两种类型的utf-8代码都可以正确转换为表情符号。

input code

ouput

所以,我的问题是:

  1. 为什么一个表情符号有两种类型的utf-8代码?

  2. 哪里有包含两种utf-8代码的文件?

  3. 如何使用ios语言中的NSString正确转换utf-8中的字符串?

2 个答案:

答案 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 ";