NSLog неправильная кодировка - PullRequest
12 голосов
/ 06 апреля 2009

У меня проблема со следующим кодом:

NSString *strValue=@"你好";
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 *strValue=@"你好";
char temp[200];
strcpy(temp, [strValue UTF8String]);
printf("%s", temp);
strcpy(temp, [strValue cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]);
NSLog(@"%S", temp);

Ответы [ 4 ]

10 голосов
/ 07 апреля 2009

Спецификатор формата NSLog% s находится в системной кодировке, которая, по-видимому, всегда является MacRoman, а не Unicode, поэтому она может отображать только символы в кодировке MacRoman. Лучший вариант с NSLog - просто использовать спецификатор формата собственного объекта% @ и передавать NSString напрямую, а не преобразовывать его в строку C. Если у вас есть только строка C и вы хотите использовать NSLog для отображения сообщения вместо printf или asl, вам придется сделать что-то, как предлагает Дон, чтобы сначала преобразовать строку в объект NSString.

Итак, все они должны отображать ожидаемую строку:

NSString *str = @"你好";
const char *cstr = [str UTF8String];
NSLog(@"%@", str);
printf("%s\n", cstr);
NSLog(@"%@", [NSString stringWithUTF8String:cstr]);

Если вы решили использовать asl, обратите внимание, что, хотя он принимает строки в формате UTF8 и передает правильную кодировку демону syslog (чтобы он правильно отображался в консоли), он отображает строку для визуального кодирования при отображении к терминалу или регистрации в дескрипторе файла, поэтому значения, отличные от ASCII, будут отображаться как экранированные последовательности символов.

4 голосов
/ 06 апреля 2009

Я предполагаю, что NSLog предполагает другую кодировку для 8-битных C-строк, чем UTF-8, и это может быть та, которая не поддерживает китайские символы. Как это ни странно, вы можете попробовать это:

NSLog(@"%@", [NSString stringWithCString: temp encoding: NSUTF8StringEncoding]);
2 голосов
/ 06 апреля 2009

Я знаю, что вы, вероятно, ищете ответ, который поможет вам понять, что происходит.

Но это то, что вы можете сделать, чтобы решить свою проблему прямо сейчас:

NSLog(@"%@", strValue);
0 голосов
/ 18 мая 2015
    #   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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...