我从服务器检索一些短信时遇到了一些麻烦,尤其是编码时。消息可以来自多种语言(因此它们可以有重音,可以是日语,......)并且可以包含表情符号。
我正在使用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
值
我无法控制我的服务器,因此在发送消息之前我无法更改其编码。
答案 0 :(得分:1)
问题是正确确定编码。表情符号不属于NSWindowsCP1252StringEncoding,因此转换失败。
而且,你正在经历一个不必要的阶段。不要制作中间C字符串!只需调用NSString的initWithData:encoding:
。
在你的情况下,调用NSWindowsCP1252StringEncoding总是一个错误;我很惊讶这适用于任何字符串。 C3A9是Unicode(UTF8)。所以只需从一开始就使用UTF8编码(NSUTF8StringEncoding)调用initWithData:encoding:
,一切都会好的。