没有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: