没有initWithCString将char *转换为NSString的正确方法?

我将SQLite3数据库的结果列表拖入UITableView 。 我从数据库中提取文本的代码如下:

 char *menuNameChars = (char *) sqlite3_column_text(statement, 1); NSString *menuName = [[NSString alloc] initWithUTF8String:menuNameChars]; NSLog(@"Retrieved %s,%@ from DB.", menuNameChars, menuName); 

当我使用initWithUTF8String ,有时会从数据库中正确复制信息。 但有时,信息会从char*正确显示,而不是从NSString

 2011-10-24 22:26:54.325 [23974:207] Retrieved Cravin Chicken Sandwich – Crispy, (null) from DB. 2011-10-24 22:26:54.327 [23974:207] Retrieved Cravin Chicken Sandwich – Roast, (null) from DB. 2011-10-24 22:26:54.331 [23974:207] Retrieved Jr Chicken Sandwich, Jr Chicken Sandwich from DB. 2011-10-24 22:26:54.337 [23974:207] Retrieved Prime-Cut Chicken Tenders - 3 Piece, Prime-Cut Chicken Tenders - 3 Piece from DB. 

现在,如果我用initWithUTF8String替换initWithUTF8String ,代码就可以正常工作。 但是,XCode 4.2告诉我initWithCString已被弃用。 我知道我不想使用已弃用的代码,但如果initWithUTF8String不起作用,我应该使用什么?

(编辑)的

我可以看到你的第一个日志行中的破折号( Retrieved Cravin Chicken Sandwich ... )不是简单的ASCII HYPHEN-MINUS (U + 002D,UTF-8 2D)。 它是Unicode EN DASH字符(U + 2013,UTF-8 E2 80 93)。 第二行也是如此。 我猜他们在数据库中编码错误。 如果你给-[NSString initWithUTF8String:]一个无效的UTF-8的C字符串,它返回nil

尝试打印menuNameChars的hex转储。 您可以通过在调用sqlite3_column_text之后在行上设置断点来实现此目的。 到达断点时,右键单击/控制 – 单击堆栈框架窗口中的menuNameChars ,然后选择View memory of "*menuNameChars" (注意* )。

看起来数据不会被编码为UTF-8。 您应该找出正在使用的编码,然后使用initWithCString:encoding:并传递正确的编码。

尝试stringWithFormat:的强大stringWithFormat: