Câu trả lời:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);
Chỉnh sửa: Sau một vài năm, hãy để tôi mở rộng câu trả lời này. Như đã chỉ ra một cách đúng đắn, rất có thể bạn sẽ muốn sử dụng cStringUsingEncoding:với NSASCIIStringEncodingnếu bạn sắp kết thúc sử dụng std::string. Bạn có thể sử dụng UTF-8 với bình thường std::strings, nhưng hãy nhớ rằng chúng hoạt động trên byte chứ không phải trên các ký tự hoặc thậm chí grapheme. Để "bắt đầu" tốt, hãy xem câu hỏi này và câu trả lời của nó .
Cũng lưu ý, nếu bạn có một chuỗi không thể được biểu diễn dưới dạng ASCII nhưng bạn vẫn muốn nó trong một std::stringvà bạn không muốn các ký tự không phải ASCII trong đó, bạn có thể sử dụng dataUsingEncoding:allowLossyConversion:để có được một NSDatabiểu diễn của chuỗi với ASCII được mã hóa mất dữ liệu nội dung và sau đó ném nó vàostd::string
-cStringUsingEncoding:thay thế. :)
news được đánh giá cao, và a std::shared_ptrhoặc std::unique_ptrnên được ưu tiên hơn.
Như đã lưu ý trên philjordan.eu, nó cũng có thể là NSString nil. Trong trường hợp như vậy, diễn viên nên được thực hiện như sau:
// LƯU Ý: nếu foo là nil, điều này sẽ tạo ra một chuỗi C ++ trống
// thay vì tham chiếu đến con trỏ NULL từ UTF8String.
Điều này sẽ dẫn bạn đến một chuyển đổi như vậy:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);