stringWithCString устарела ... так что мне использовать с char *, возвращаемым sysctlbyname? - PullRequest
11 голосов
/ 09 августа 2011

Я знаю, как справиться с этим при изменении 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;
}

Заранее спасибо!

Ответы [ 4 ]

20 голосов
/ 09 августа 2011

Если используемая вами строка C имеет кодировку UTF-8, используйте stringWithUTF8String:.Если это простой ASCII, то используйте stringWithCString:encoding: с кодировкой NSASCIIStringEncoding.В противном случае он, вероятно, закодирован с использованием Latin-1, и в этом случае вы должны использовать stringWithCString:encoding: с кодировкой NSISOLatin1StringEncoding.

В этом случае sysctlbyname почти наверняка вернет вам ASCIIстрока, поэтому вы должны сделать это:

NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];

Хотя использование любого из двух других методов не принесет вам вреда.

2 голосов
/ 09 августа 2011

Вам просто нужно указать строковую кодировку, которая является ASCII в случае sysctlbyname:

NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
1 голос
/ 02 сентября 2015

Если вы нашли ошибку в

errorString = [NSString stringWithCString:iax_errstr];

попробуйте это

errorString = [NSString stringWithCString:iax_errstr encoding:NSASCIIStringEncoding]
1 голос
/ 09 августа 2011

stringWithCString: устарела в пользу stringWithCString: encoding :.Вы можете использовать [NSString defaultCStringEncoding], чтобы точно воспроизвести поведение stringWithCString: но вам, вероятно, лучше указать NSASCIIStringEncoding или NSUTF8StringEncoding.Кодировка, возвращаемая sysctlbyname, кажется неявной, так что 7-битный ASCII - безопасная ставка, поэтому подходит любая кодировка.

...