0

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

我正在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值。
我无法控制我的服务器,因此在向我发送消息之前我无法更改它们的编码。

4

1 回答 1

1

问题是正确确定编码。表情符号不是 NSWindowsCP1252StringEncoding 的一部分,因此转换失败。

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

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

于 2014-03-19T16:52:56.047 回答