我将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
不起作用,我应该使用什么?
答案 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+ 起进行的。