6 Stimmen

Richtiger Weg, um char* in NSString ohne initWithCString umzuwandeln?

Ich rufe eine Liste von Ergebnissen aus einer SQLite3-Datenbank in eine UITableView ab. Der Code, mit dem ich Text aus der Datenbank abrufe, sieht folgendermaßen aus:

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

Wenn ich initWithUTF8String verwende, wird manchmal die Information ordnungsgemäß aus der Datenbank kopiert. Manchmal wird die Information jedoch ordnungsgemäß aus dem char*, aber nicht aus dem NSString angezeigt:

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

Wenn ich initWithUTF8String durch initWithCString ersetze, funktioniert der Code einwandfrei. Allerdings sagt mir XCode 4.2, dass initWithCString veraltet ist. Ich weiß genug, um zu verstehen, dass ich keinen veralteten Code verwenden möchte, aber wenn initWithUTF8String nicht funktioniert, was sollte ich dann verwenden?

4voto

rob mayoff Punkte 356759

Ich sehe, dass der Bindestrich in Ihrer ersten Protokollzeile (Abrufen des Cravin Chicken Sandwich ...) kein einfaches ASCII HYPHEN-MINUS (U+002D, UTF-8 2D) ist. Es ist ein Unicode-Zeichen EN DASH (U+2013, UTF-8 E2 80 93). Gleiches gilt für die zweite Zeile. Meine Vermutung ist, dass sie in Ihrer Datenbank falsch codiert sind. Wenn Sie -[NSString initWithUTF8String:] einen C-String geben, der kein gültiges UTF-8 ist, gibt es nil zurück.

Versuchen Sie, einen Hexadezimaldump von menuNameChars auszudrucken. Sie können das tun, indem Sie einen Breakpoint in der Zeile nach dem Aufruf von sqlite3_column_text setzen. Wenn der Befehlsunterbrechungspunkt erreicht ist, klicken Sie mit der rechten Maustaste/Steuerklick auf menuNameChars in Ihrem Stapelrahmenfenster und wählen Sie Speicheransicht von "*menuNameChars" (beachten Sie das *).

2voto

Chuck Punkte 228137

Es scheint, dass die Daten nicht als UTF-8 codiert sind. Sie sollten herausfinden, welche Codierung verwendet wird, und dann initWithCString:encoding: verwenden und die richtige Codierung angeben.

2voto

ingconti Punkte 9854

Probieren Sie die Power von stringWithFormat: aus

0voto

Anthony Punkte 81

Wenn Sie genau hinschauen, sieht es so aus, als wäre die Instanzmethode initWithCString: bei Apple Developer nur für die Version ohne expliziten encoding:-Spezifikator veraltet. Mit gutem Grund könnte man argumentieren und argumentieren, dass sie daher perfekt für die Konvertierung von const char * C-Strings in NSString gültig ist. Bitte vergleichen Sie:

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

mit neueren initWithCString:encoding:

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

Diese Änderung der Foundation-API wurde seit macOS 10.4+ vorgenommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X