Mam NSString
obiekt i chcę go przekształcić w plikstd::string
.
Jak to zrobić w Objective-C ++?
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:
ze NSASCIIStringEncoding
jeśli masz zamiar skończyć użyciu std::string
. Możesz używać UTF-8 z normalnym std::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
-cStringUsingEncoding:
zamiast tego. :)
new
są mile widziane, a std::shared_ptr
lub std::unique_ptr
powinno być preferowane.
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:
// UWAGA: jeśli foo jest równe nil, to da pusty łańcuch C ++
// zamiast wyłuskiwania wskaźnika NULL z UTF8String.
Doprowadziłoby to do takiej konwersji:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);