2014-03-19 4 views
0

У меня возникли проблемы с получением текстового сообщения с моего сервера, особенно с кодировкой. Сообщения могут быть со многих языков (поэтому они могут иметь акценты, быть на японском языке, ...) и могут включать эможи.Проблема с кодировкой строки и emoji

Я получаю сообщение с 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

Проблема заключается в правильном определении кодировки. Emoji не являются частью NSWindowsCP1252StringEncoding, поэтому преобразование просто не выполняется.

Кроме того, вы проходите через ненужную стадию. Не делайте промежуточную строку C! Просто позвоните NSString initWithData:encoding:.

В вашем случае вызов NSWindowsCP1252StringEncoding всегда был ошибкой; Я удивлен, что это работало для любой строки. C3A9 является Unicode (UTF8). Поэтому просто вызовите initWithData:encoding: с кодировкой UTF8 (NSUTF8StringEncoding) из get-go, и все будет хорошо.

+0

Я получаю 'dataMessage' методом' AFHTTPRequestOperation' из библиотеки 'AFNEtworking'. 'dataMessage' является возвратом объекта с моего сервера, и, как вы можете видеть, это уже строка. Поэтому я не могу использовать 'initWithData: encoding:' – zbMax