不推荐使用stringWithCString ...那么我对sysctlbyname返回的char *使用什么?

时间:2011-08-09 04:44:01

标签: iphone ios sdk nsstring

我知道在SQLite中更改stringWithCString时如何处理此问题...而只是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 个答案:

答案 0 :(得分:20)

如果您使用的C字符串是UTF-8编码的,请使用stringWithUTF8String:。如果是纯ASCII,则使用编码为stringWithCString:encoding:的{​​{1}}。否则,它可能使用Latin-1编码,在这种情况下,您应使用编码为NSASCIIStringEncoding的{​​{1}}。

在这种情况下,stringWithCString:encoding:几乎肯定会给你一个ASCII字符串,所以你应该这样做:

NSISOLatin1StringEncoding

虽然使用其他两种方法中的任何一种都不会造成伤害。

答案 1 :(得分:2)

您只需指定字符串编码,在sysctlbyname:

的情况下为ASCII
NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];

答案 2 :(得分:1)

stringWithCString:不推荐使用stringWithCString:encoding:。您可以使用[NSString defaultCStringEncoding]来准确再现stringWithCString的行为:但您可能最好指定NSASCIIStringEncoding或NSUTF8StringEncoding。 sysctlbyname返回的编码似乎是隐式的,因此7位ASCII是一个安全的选择,使得任一编码都适合。

答案 3 :(得分:1)

如果您在

中发现错误
errorString = [NSString stringWithCString:iax_errstr];

试试这个

errorString = [NSString stringWithCString:iax_errstr encoding:NSASCIIStringEncoding]