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 NSASCIIStringEncoding
nế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::string
và 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 NSData
biể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ế. :)
new
s được đánh giá cao, và a std::shared_ptr
hoặc std::unique_ptr
nê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]);