Правильный способ конвертировать char * в NSString без initWithCString? - PullRequest
6 голосов
/ 25 октября 2011

Я перетаскиваю список результатов из базы данных 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 не работает, что мне следует использовать?

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

(отредактированный)

Я вижу, что черта в вашей первой строке журнала (Retrieved Cravin Chicken Sandwich ...) не является простой ASCII HYPHEN-MINUS (U + 002D, UTF-8 2D). Это Unicode EN DASH символ (U + 2013, UTF-8 E2 80 93). То же самое для второй строки. Я думаю, они неправильно закодированы в вашей базе данных. Если вы дадите -[NSString initWithUTF8String:] C-строку, которая не является допустимой UTF-8, она возвращает nil.

Попробуйте напечатать шестнадцатеричный дамп menuNameChars. Вы можете сделать это, установив точку останова на линии после вызова sqlite3_column_text. Когда точка останова достигнута, щелкните правой кнопкой мыши (или удерживая клавишу Control) menuNameChars в окне фрейма стека и выберите View memory of "*menuNameChars" (обратите внимание на *).

2 голосов
/ 06 февраля 2012

попробовать мощность stringWithFormat:

2 голосов
/ 25 октября 2011

Казалось бы, данные не закодированы как UTF-8. Вы должны выяснить, какая кодировка используется, а затем использовать initWithCString:encoding: и передать правильную кодировку.

...