NSString'i std :: string'e nasıl dönüştürebilirim?


Yanıtlar:


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

Düzenleme: Birkaç yıl sonra, bu cevabı genişletmeme izin verin. Haklı belirttiği gibi, büyük olasılıkla kullanmak isteyeceksiniz cStringUsingEncoding:ile NSASCIIStringEncodingkullandığınız sonuna kadar gidiyoruz std::string. UTF-8'i normal olarak kullanabilirsiniz std::strings, ancak bunların baytlar üzerinde çalıştığını ve karakterlerde veya hatta grafiklerde çalışmadığını unutmayın. İyi bir "başlangıç" için, bu soruya ve yanıtına bir göz atın .

Ayrıca, ASCII olarak temsil edilemeyen bir dizeniz varsa, ancak yine de onu std::stringistiyorsanız ve orada ASCII olmayan karakterler istemiyorsanız , kayıplı kodlanmış ASCII ile dizenin dataUsingEncoding:allowLossyConversion:bir NSDatatemsilini elde etmek için kullanabilirsiniz . içerik ve sonra bunustd::string


13
Kodlamaya dikkat edin. UTF-8 genellikle iyi bir seçim olsa da, çalıştığınız API, örneğin saf ASCII veya sistem kod sayfası bekliyorsa, -cStringUsingEncoding:bunun yerine kullanmanız gerekir . :)
Jonathan Grynspan

13
Bu bir bellek sızıntısıdır, eğer onu silmiyorsanız, döndürülen işaretçi bir Objective-C referansı sayılan nesne değildir. Genel olarak, std :: string için new operatörünü kullanmaktan kaçınmalısınız.
SiimKallas

Bu, kabul edilen cevap olmamalı ve bu dönüşümü yaparken kesinlikle dikkate alınması gereken ilk şey olmamalıdır.
JBL

@JBL Sadece 4 yıl ve birkaç hafta sonra cevabımı genişletmek için etrafta dolaştım. Umarım şimdi daha kabul edilebilirdir.
JustSid

@JustSid Fikrimi kesin olarak belirtmeliydim, ancak diğer sorun varsayılan olarak bir işaretçi kullanımı. Nitekim, C ++ bilgisi olmayan, ObjC geçmişine sahip bir iş arkadaşı, bunu silmeden, bir bellek sızıntısıyla sonuçlanan kullandı. Ve daha genel olarak; wild news hoş karşılanmaz ve a std::shared_ptrveya std::unique_ptrtercih edilmelidir.
JBL

50

Ynau'nun yorumda önerdiği gibi, genel bir durumda, her şeyi yığın yerine yığında tutmak (öbek newüzerinde dizeyi oluşturur kullanarak ), dolayısıyla (UTF8 kodlaması varsayılarak):

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

8

Philjordan.eu'da belirtildiği gibi NSString de olabilir nil. Böyle bir durumda alçı şu şekilde yapılmalıdır:

// NOT: eğer foo nil ise bu boş bir C ++ dizesi üretecektir

// UTF8String'den NULL göstericisinin başvurusunu kaldırmak yerine.

Bu sizi böyle bir dönüşüme götürür:

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

1
Bu son derece faydalıdır. Neredeyse herkesi görmekten korkmak onu görmezden geliyor. NIL'de kaza yapacaksınız.
P i
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.