如何将NSString转换为std :: string?


Answers:


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

编辑:几年后,让我扩展这个答案。如正确指出的那样,如果最终要使用cStringUsingEncoding:NSASCIIStringEncoding则很可能要使用std::string。您可以将UTF-8与normal一起使用std::strings,但请记住,这些操作针对字节而不是字符甚至字形进行操作。为了获得良好的“入门”,请查看此问题及其答案

另外请注意,如果您有不能被表示为ASCII字符串,但你仍然希望它在std::string你不希望在有非ASCII字符,你可以用dataUsingEncoding:allowLossyConversion:得到一个NSData字符串的表示和有损编码ASCII内容,然后将其扔给您std::string


13
小心编码。通常,UTF-8是一个不错的选择,但是如果您使用的API期望使用纯ASCII或系统代码页,则必须使用它-cStringUsingEncoding:。:)
Jonathan Grynspan

13
如果不删除它,则是内存泄漏,返回的指针不是Objective-C引用计数的对象。通常,应避免对std :: string使用new运算符。
2014年

这不应该是公认的答案,并且绝对不是进行该转换时要考虑的第一件事。
JBL

@JBL仅仅4年零几周后,我四处寻找答案。我希望现在可以接受了。
JustSid

@JustSid我应该弄清楚我的意见,但是另一个问题是默认情况下使用指针。实际上,一个具有ObjC背景,不具备C ++知识的同事使用了它,而没有删除,最终导致了内存泄漏。更一般地;Wild new不赞成使用,应首选std::shared_ptrstd::unique_ptr
JBL

50

正如Ynau在评论中所建议的那样,通常情况下,最好将所有内容都保留在堆栈上而不是堆中(使用new在堆上创建字符串),因此(假设采用UTF8编码):

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

8

philjordan.eu所述,NSString也可能是nil。在这种情况下,应按以下步骤进行转换:

//注意:如果foo为nil,将产生一个空的C ++字符串

//而不是从UTF8String解引用NULL指针。

这将导致您进行这样的转换:

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

1
这是非常有用的。担心看到几乎每个人都忽略了它。你们都在NIL上崩溃了。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.