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

gab*_*bor 91 objective-c objective-c++

我有一个NSString对象,并希望将其转换为std::string.

我如何在Objective-C++中执行此操作?

Jus*_*Sid 126

NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);
Run Code Online (Sandbox Code Playgroud)

编辑:几年后,让我扩展这个答案.作为理所当然地指出的那样,你很可能希望使用cStringUsingEncoding:NSASCIIStringEncoding如果你要最终使用std::string.您可以正常使用UTF-8 std::strings,但请记住,这些操作是按字节操作而不是字符甚至字形操作.要获得良好的"入门",请查看此问题及其答案.

另请注意,如果您的字符串不能表示为ASCII但仍然需要它,std::string并且您不希望其中包含非ASCII字符,则可以使用有损编码ASCII dataUsingEncoding:allowLossyConversion:NSData表示字符串内容,然后扔到你的std::string

  • 小心编码.虽然UTF-8通常是一个不错的选择,如果你正在使用的API要求,比如说,纯ASCII或系统代码页,你将不得不使用`-cStringUsingEncoding:'来代替.:) (13认同)
  • 如果你不删除它,这是一个内存泄漏,返回的指针不是Objective-C引用计数对象.通常,您应该避免对std :: string使用operator new. (13认同)

Mar*_*o83 50

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

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);
Run Code Online (Sandbox Code Playgroud)


Bru*_*eri 6

philjordan.eu所述,也可能是NSString nil.在这种情况下,演员应该这样做:

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

//而不是从UTF8String中取消引用NULL指针.

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

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

  • 这非常有用。担心看到几乎每个人都在忽视它。你们都会在 NIL 上崩溃。 (2认同)