2014-03-19 3 views
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]; 

그러나,하는 NULL 값을 반환 cStringUsingEncoding: 여기에 일부 로그의 예입니다.
서버에 대한 제어권이 없으므로 메시지가 전송되기 전에 인코딩을 변경할 수 없습니다.

답변

1

문제는 인코딩을 올바르게 결정하는 것입니다. Emoji는 NSWindowsCP1252StringEncoding의 일부가 아니므로 변환이 실패합니다.

또한 불필요한 단계를 거치고 있습니다. 중간 C 문자열을 만들지 마라! NSString의 initWithData:encoding:을 호출하면됩니다.

NSWindowsCP1252StringEncoding을 호출하는 것은 항상 실수였습니다. 나는 이것이 문자열에 대해 효과가 있었다는 것에 놀랐습니다. C3A9는 유니 코드 (UTF8)입니다. 따라서 UTF8 인코딩 (NSUTF8StringEncoding)을 사용하여 initWithData:encoding:을 호출하면 모두 잘 수행됩니다.

+0

'AFNEtworking' 라이브러리에서'AFHTTPRequestOperation' 메소드로'dataMessage'를 받았습니다. 'dataMessage'는 내 서버에서 반환되는 객체이며, 알 수 있듯이 이미 문자열입니다. 그래서 나는'initWithData : encoding :'을 사용하지 않는다. – zbMax