Làm cách nào để chuyển đổi NSString thành chuỗi std :: string?


Câu trả lời:


134
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


13
Cẩn thận khi mã hóa. Mặc dù UTF-8 nói chung là một lựa chọn tốt, nhưng nếu API bạn đang làm việc mong đợi, chẳng hạn như ASCII thuần túy hoặc mã hệ thống, bạn sẽ phải sử dụng -cStringUsingEncoding:thay thế. :)
Jonathan Grynspan

13
Đây là lỗi rò rỉ bộ nhớ nếu bạn không xóa nó, con trỏ trả về không phải là đối tượng được đếm tham chiếu Objective-C. Nói chung, bạn nên tránh sử dụng toán tử new cho std :: string.
SiimKallas

Đây không phải là câu trả lời được chấp nhận và chắc chắn không phải là điều đầu tiên cần xem xét khi thực hiện chuyển đổi đó.
JBL

@JBL Chỉ sau 4 năm và vài tuần, tôi đã đi vòng quanh để mở rộng câu trả lời của mình. Tôi hy vọng nó dễ chấp nhận hơn bây giờ.
JustSid

@JustSid Tôi lẽ ra nên sửa lại ý kiến ​​của mình, nhưng vấn đề khác là việc sử dụng con trỏ theo mặc định. Trên thực tế, một đồng nghiệp có nền tảng objC, không có kiến ​​thức về C ++ đã sử dụng mà không xóa, kết thúc là rò rỉ bộ nhớ. Và nói chung; wild news được đánh giá cao, và a std::shared_ptrhoặc std::unique_ptrnên được ưu tiên hơn.
JBL

50

Như Ynau đã đề xuất trong nhận xét, trong trường hợp chung, tốt hơn là giữ mọi thứ trên ngăn xếp thay vì đống (sử dụng newtạo chuỗi trên heap), do đó (giả sử mã hóa UTF8):

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);

8

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]);

1
Điều này rất hữu ích. Lo lắng khi thấy hầu hết mọi người đều bỏ qua nó. Tất cả đều bị lỗi trên NIL.
P i
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.