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

时间:2011-10-25 03:31:22

标签: objective-c ios nsstring char

我将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替换为initWithCString,则代码可以正常运行。但是,XCode 4.2告诉我initWithCString已被弃用。我知道我不想使用已弃用的代码,但如果initWithUTF8String不起作用,我应该使用什么?

4 个答案:

答案 0 :(得分:4)

(编辑)的

我可以看到第一个日志行(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的十六进制转储。您可以通过在调用sqlite3_column_text后在行上设置断点来实现此目的。到达断点时,右键单击/按住Control键并单击堆栈框架窗口中的menuNameChars,然后选择View memory of "*menuNameChars"(请注意*)。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

尝试stringWithFormat:

的力量

答案 3 :(得分:0)

如果您仔细查看 Apple Developer,似乎实例方法 initWithCString: 仅在没有显式 encoding: 说明符的版本中被弃用。有充分的理由可以争论,因此对于 const char * C-string 转换为 NSString 完全有效。请比较:

https://developer.apple.com/documentation/foundation/nsstring/1497394-initwithcstring

到更新的initWithCString:encoding:

https://developer.apple.com/documentation/foundation/nsstring/1411950-initwithcstring?language=objc

此 Foundation API 更改是自 macOS 10.4+ 起进行的。