Подтвердить что ты не робот

Некорректная кодировка 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);
4b9b3361

Ответ 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;
}