Mam NSStringobiekt 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 NSASCIIStringEncodingjeś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::stringi nie chcesz tam znaków innych niż ASCII, możesz użyć, dataUsingEncoding:allowLossyConversion:aby uzyskać NSDatareprezentację ciągu z kodowaniem stratnym ASCII treści, a następnie rzuć to na swój plikstd::string
-cStringUsingEncoding:zamiast tego. :)
newsą mile widziane, a std::shared_ptrlub std::unique_ptrpowinno 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]);