将一个填充NSStrings的NSArray转换为UTF8String向量

时间:2013-01-22 01:26:15

标签: objective-c c nsstring nsarray

所以我想知道,是否有一些快速方法将一个充满NSStrings的NSArray转换为等效的UTF8string值?

我想在NSArray中存储一些参数配置,然后在一个以(int argv,const char * argv [])为参数的函数中使用它们。

我以复杂的方式实现了这个

int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
    argv[i] = (const char *)malloc(sizeof(char)*[[gameParameters objectAtIndex:i] length]+1);
    strncpy((void *)argv[i], [[gameParameters objectAtIndex:i] UTF8String], [[gameParameters objectAtIndex:i] length]+1);
}

但我并不满意,清理记忆很乏味。

你知道更好的方法来实现这个结果吗?

1 个答案:

答案 0 :(得分:1)

如果字符串包含非ASCII字符,则当前实现不正确。例如,字符串@“é”(SMALL LETTER E WITH ACUTE)的长度为1,但UTF-8序列“C3 A9”的长度为2个字节。您的代码不会为该字符串分配足够的内存。

(换句话说:[string length]返回字符串中的Unicode字符数,而不是UTF-8表示的字节数。)

按照Kevin Ballard的建议,使用strdup()可以解决这个问题:

argv[i] = strdup([[gameParameters objectAtIndex:i] UTF8String]);

但是你还应该检查是否有必要复制字符串。如果在当前自动释放上下文中调用该函数,则以下就足够了:

int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
    argv[i] = [[gameParameters objectAtIndex:i] UTF8String];
}
yourFunction(argc, argv);
free(argv);