Некорректная кодировка NSLog
У меня возникла проблема со следующим кодом:
NSString *[email protected]"你好";
char temp[200];
strcpy(temp, [strValue UTF8String]);
printf("%s", temp);
NSLog(@"%s", temp);
в первой строке кодов два китайских символа заключаются в двойные кавычки. Проблема заключается в том, что функция printf может отображать китайские символы должным образом, но NSLog не может.
Спасибо всем. Я решил решить эту проблему. Foundation использует UTF-16 по умолчанию, поэтому, чтобы использовать NSLog для вывода строки c в примере, я должен использовать cStringUsingEncoding для получения строки UTF-16 c и использовать% S для замены% s.
NSString *[email protected]"你好";
char temp[200];
strcpy(temp, [strValue UTF8String]);
printf("%s", temp);
strcpy(temp, [strValue cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]);
NSLog(@"%S", temp);
Ответы
Ответ 1
Спецификатор формата NSLog% s находится в системной кодировке, которая, кажется, всегда является MacRoman, а не unicode, поэтому она может отображать символы только в кодировке MacRoman. Ваш лучший вариант с NSLog заключается в том, чтобы использовать спецификатор собственного объекта% @и передать NSString напрямую, вместо того, чтобы преобразовать его в C String. Если у вас есть только строка C и вы хотите использовать NSLog для отображения сообщения вместо printf или asl, вам нужно сделать что-то вроде предложения Don, чтобы сначала преобразовать строку в объект NSString.
Итак, все они должны отображать ожидаемую строку:
NSString *str = @"你好";
const char *cstr = [str UTF8String];
NSLog(@"%@", str);
printf("%s\n", cstr);
NSLog(@"%@", [NSString stringWithUTF8String:cstr]);
Если вы решили использовать asl, обратите внимание, что, когда он принимает строки в формате UTF8 и передает правильную кодировку демону syslog (так что он будет отображаться правильно в консоли), он кодирует строку для визуального кодирования при отображении к терминалу или протоколированию в дескрипторе файла, поэтому значения, отличные от ASCII, будут отображаться как экранированные последовательности символов.
Ответ 2
Я предполагаю, что NSLog предполагает другую кодировку для 8-битных C-строк, чем UTF-8, и может быть такой, который не поддерживает китайские символы. Неловко, как есть, вы можете попробовать следующее:
NSLog(@"%@", [NSString stringWithCString: temp encoding: NSUTF8StringEncoding]);
Ответ 3
Я знаю, что вы, вероятно, ищете ответ, который поможет вам понять, что происходит.
Но это то, что вы могли бы сделать, чтобы решить вашу проблему прямо сейчас:
NSLog(@"%@", strValue);
Ответ 4
# define NSLogUTF8(a,b) NSLog(a,[NSString stringWithCString:[[NSString stringWithFormat:@"%@",b] cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding])
#define NSLogUTF8Ex(a,b) NSLog(a,[MLTool utf8toNString:[NSString stringWithFormat:@"%@",b]])
+(NSString*)utf8toNString:(NSString*)str{
NSString* strT= [str stringByReplacingOccurrencesOfString:@"\\U" withString:@"\\u"];
//NSString *strT = [strTemp mutableCopy];
CFStringRef transform = CFSTR("Any-Hex/Java");
CFStringTransform((__bridge CFMutableStringRef)strT, NULL, transform, YES);
return strT;
}