2011-08-09 12 views
11

Wiem, jak sobie z tym poradzić, zmieniając stringWithCString w SQLite ... po prostu stringWithUTF8String. Czy to samo dotyczy char *, gdy zostanie zwrócone przez sysctlbyname? (patrz kod poniżej)stringWithCString przestarzałe ... więc czego używam z char * zwróconym przez 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; 
} 

Z góry dziękuję!

+0

tak, stringWithUTF8String zwraca ciąg znaków. – rptwsthi

Odpowiedz

19

Jeśli ciąg znaków C, którego używasz, jest kodowany w UTF-8, a następnie użyj stringWithUTF8String:. Jeśli jest to zwykły ASCII, użyj stringWithCString:encoding: z kodowaniem NSASCIIStringEncoding. W przeciwnym razie jest to prawdopodobnie kodowane przy użyciu Latin-1, w takim przypadku należy użyć stringWithCString:encoding: z kodowaniem NSISOLatin1StringEncoding.

W tym przypadku sysctlbyname jest prawie na pewno będzie oddać ciąg ASCII, więc należy to zrobić:

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

Choć przy użyciu jednej z dwóch innych metod zrobi ci krzywdy.

2

Trzeba tylko określić kodowanie ciąg znaków ASCII, czyli w przypadku sysctlbyname:

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

stringWithCString: zostaje zastąpiona stringWithCString: kodowanie :. Możesz użyć [NSString defaultCStringEncoding], aby dokładnie odtworzyć zachowanie stringWithCString: ale prawdopodobnie lepiej jest podać NSASCIIStringEncoding lub NSUTF8StringEncoding. Kodowanie zwracane przez sysctlbyname wydaje się być niejawne, więc 7-bitowy ASCII jest bezpiecznym wyborem, co czyni kodowanie odpowiednim.

1

Jeśli znajdziesz błąd w

errorString = [NSString stringWithCString:iax_errstr]; 

spróbować

errorString = [NSString stringWithCString:iax_errstr encoding:NSASCIIStringEncoding] 
Powiązane problemy