StringWithCString не рекомендуется... так что я использую с char *, возвращаемым sysctlbyname?
Я знаю, как справиться с этим при изменении stringWithCString
в SQLite... вместо этого вы просто stringWithUTF8String
. Это то же самое с char *
, когда оно возвращается sysctlbyname
? (см. код ниже)
- (NSString *) platform{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine];
free(machine);
return platform;
}
Спасибо заранее!
Ответы
Ответ 1
Если строка C, которую вы используете, кодируется UTF-8, используйте stringWithUTF8String:
. Если это просто ASCII, используйте stringWithCString:encoding:
с кодировкой NSASCIIStringEncoding
. В противном случае он, вероятно, кодируется с использованием Latin-1, и в этом случае вы должны использовать stringWithCString:encoding:
с кодировкой NSISOLatin1StringEncoding
.
В этом случае sysctlbyname
почти наверняка вернет вам строку ASCII, поэтому вы должны это сделать:
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
Хотя использование любого из двух других методов не принесет вам вреда.
Ответ 2
Вам просто нужно указать строковое кодирование, которое является ASCII в случае sysctlbyname:
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
Ответ 3
stringWithCString: устарел в пользу stringWithCString: encoding:. Вы можете использовать [NSString defaultCStringEncoding], чтобы точно воспроизвести поведение stringWithCString: но вам, вероятно, лучше указать NSASCIIStringEncoding или NSUTF8StringEncoding. Кодировка, возвращаемая sysctlbyname, кажется неявной, поэтому 7-разрядная ASCII является безопасной ставкой, что делает любую кодировку подходящей.
Ответ 4
Если вы нашли ошибку в
errorString = [NSString stringWithCString:iax_errstr];
попробуйте это
errorString = [NSString stringWithCString:iax_errstr encoding:NSASCIIStringEncoding]