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]