Come si converte una NSString in una std :: string?


Risposte:


134
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);

Modifica: dopo alcuni anni, lasciatemi espandere questa risposta. Come giustamente sottolineato, molto probabilmente vorrai usare cStringUsingEncoding:con NSASCIIStringEncodingse finirai per usare std::string. Puoi usare UTF-8 normalmente std::strings, ma tieni presente che questi operano sui byte e non sui caratteri o addirittura sui grafemi. Per un buon "inizio", controlla questa domanda e la sua risposta .

Nota inoltre, se hai una stringa che non può essere rappresentata come ASCII ma la vuoi comunque in un std::stringe non vuoi caratteri non ASCII lì, puoi usarla dataUsingEncoding:allowLossyConversion:per ottenere una NSDatarappresentazione della stringa con ASCII codificato con perdita contenuto e poi lancialo al tuostd::string


13
Attento alla codifica. Sebbene UTF-8 sia generalmente una buona scelta, se l'API con cui stai lavorando si aspetta, ad esempio, ASCII puro o la tabella codici di sistema, dovrai -cStringUsingEncoding:invece usarla . :)
Jonathan Grynspan

13
Questa è una perdita di memoria se non la elimini, il puntatore restituito non è un oggetto conteggiato di riferimento Objective-C. In generale dovresti evitare di usare l'operatore new per std :: string.
SiimKallas

Questa non dovrebbe essere la risposta accettata e sicuramente non la prima cosa da considerare quando si esegue quella conversione.
JBL

@JBL Dopo solo 4 anni e poche settimane sono andato in giro per espandere la mia risposta. Spero sia più accettabile adesso.
JustSid

@ JustSid avrei dovuto precisare la mia opinione, ma l'altro problema è l'uso di un puntatore di default. È un dato di fatto, un collega con un background ObjC, senza alcuna conoscenza di C ++ lo usava, senza eliminare, finendo in una perdita di memoria. E più in generale; i selvaggi newsono disapprovati e un std::shared_ptro std::unique_ptrdovrebbe essere preferito.
JBL

50

Come suggerito da Ynau nel commento, in un caso generale sarebbe meglio tenere tutto sullo stack invece che sull'heap (usando newcrea la stringa sull'heap), quindi (assumendo la codifica UTF8):

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);

8

Come notato su philjordan.eu , potrebbe anche essere che NSString lo sia nil. In tal caso il cast dovrebbe essere fatto in questo modo:

// NOTA: se foo è nullo, produrrà una stringa C ++ vuota

// invece di dereferenziare il puntatore NULL da UTF8String.

Questo ti porterebbe a una tale conversione:

NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

1
Questo è estremamente utile. Preoccuparsi di vedere che quasi tutti lo stanno trascurando. Andrete tutti a sbattere su NIL.
P i
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.