Antworten:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);
Bearbeiten: Lassen Sie mich nach einigen Jahren auf diese Antwort eingehen. Wie zu Recht darauf hingewiesen, werden Sie wahrscheinlich wollen die Verwendung cStringUsingEncoding:
mit , NSASCIIStringEncoding
wenn Sie mit am Ende gehen std::string
. Sie können UTF-8 mit normal verwenden std::strings
, aber denken Sie daran, dass diese mit Bytes und nicht mit Zeichen oder sogar Graphemen arbeiten. Schauen Sie sich diese Frage und ihre Antwort an , um einen guten Einstieg zu erhalten .
Beachten Sie außerdem, dass Sie eine Darstellung der Zeichenfolge mit verlustbehaftet codiertem ASCII verwenden können, wenn Sie eine Zeichenfolge haben, die nicht als ASCII dargestellt werden kann, diese aber dennoch in einer Zeichenfolge enthalten soll std::string
und keine Nicht-ASCII-Zeichen enthalten soll Inhalt, und dann werfen Sie das auf IhredataUsingEncoding:allowLossyConversion:
NSData
std::string
-cStringUsingEncoding:
stattdessen API verwenden, wenn die API, mit der Sie arbeiten, beispielsweise reines ASCII oder die Systemcodepage erwartet . :)
new
s sind verpönt und ein std::shared_ptr
oder std::unique_ptr
sollte bevorzugt werden.
Wie auf philjordan.eu vermerkt, könnte es auch sein, dass der NSString ist nil
. In einem solchen Fall sollte die Besetzung folgendermaßen erfolgen:
// HINWEIS: Wenn foo null ist, wird eine leere C ++ - Zeichenfolge erzeugt
// anstatt den NULL-Zeiger von UTF8String zu dereferenzieren.
Dies würde Sie zu einer solchen Konvertierung führen:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);