Mam NSString
obiekt i chcę go przekształcić w plikstd::string
.
Jak to zrobić w Objective-C ++?
objective-c
objective-c++
gabor
źródło
źródło
Odpowiedzi:
NSString *foo = @"Foo"; std::string bar = std::string([foo UTF8String]);
Edycja: Po kilku latach pozwól mi rozwinąć tę odpowiedź. Jak słusznie wskazał, będziesz najprawdopodobniej chcą korzystać
cStringUsingEncoding:
zeNSASCIIStringEncoding
jeśli masz zamiar skończyć użyciustd::string
. Możesz używać UTF-8 z normalnymstd::strings
, ale pamiętaj, że te operują na bajtach, a nie na znakach lub nawet grafemach. Aby dobrze „zacząć”, sprawdź to pytanie i odpowiedź .Zauważ również, że jeśli masz ciąg, który nie może być reprezentowany jako ASCII, ale nadal chcesz go w postaci
std::string
i nie chcesz tam znaków innych niż ASCII, możesz użyć,dataUsingEncoding:allowLossyConversion:
aby uzyskaćNSData
reprezentację ciągu z kodowaniem stratnym ASCII treści, a następnie rzuć to na swój plikstd::string
źródło
-cStringUsingEncoding:
zamiast tego. :)new
są mile widziane, astd::shared_ptr
lubstd::unique_ptr
powinno być preferowane.Jak zasugerował Ynau w komentarzu, w ogólnym przypadku lepiej byłoby trzymać wszystko na stosie zamiast na stercie (użycie
new
tworzy ciąg na stercie), stąd (zakładając kodowanie UTF8):NSString *foo = @"Foo"; std::string bar([foo UTF8String]);
źródło
Jak zauważono na philjordan.eu , może być również tak, że NSString jest
nil
. W takim przypadku rzut należy wykonać w następujący sposób:Doprowadziłoby to do takiej konwersji:
NSString *foo = @"Foo"; std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
źródło