麻烦的字符串编码和表情符号

时间:2014-03-19 16:35:02

标签: ios objective-c nsstring emoji nsstringencoding

我从服务器检索一些短信时遇到了一些麻烦,尤其是编码时。消息可以来自多种语言(因此它们可以有重音,可以是日语,......)并且可以包含表情符号。

我正在使用JSON检索我的消息并提供一些信息。这是一些日志示例:

(lldb) po dataMessages
<__NSCFArray 0x14ecc7f0>(
{
    author = "User 1";
    text = "Hier, c'\U00c3\U00a9tait incroyable";
},
{
...
}
)

(lldb) po [[dataMessages objectAtIndex:0] objectForKey:@"text"]
Hier, c'était incroyable

我可以通过以下方式获取正确的文字:

const char *c = [[[dataMessages objectAtIndex:indexPath.row] objectForKey:@"text"] cStringUsingEncoding:NSWindowsCP1252StringEncoding];
NSString *myMessage = [NSString stringWithCString:c encoding:NSUTF8StringEncoding];

但是,如果邮件中包含表情符号,则cStringUsingEncoding:会返回NULL值 我无法控制我的服务器,因此在发送消息之前我无法更改其编码。

1 个答案:

答案 0 :(得分:1)

问题是正确确定编码。表情符号不属于NSWindowsCP1252StringEncoding,因此转换失败。

而且,你正在经历一个不必要的阶段。不要制作中间C字符串!只需调用NSString的initWithData:encoding:

在你的情况下,调用NSWindowsCP1252StringEncoding总是一个错误;我很惊讶这适用于任何字符串。 C3A9是Unicode(UTF8)。所以只需从一开始就使用UTF8编码(NSUTF8StringEncoding)调用initWithData:encoding:,一切都会好的。