Как преобразовать NSString в std::string?

У меня есть объект NSString и вы хотите преобразовать его в std::string.

Как это сделать в Objective-C ++?

Ответ 1

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

Изменить: через несколько лет позвольте мне расширить этот ответ. Как было справедливо указано, вы, скорее всего, захотите использовать cStringUsingEncoding: с NSASCIIStringEncoding, если вы собираетесь использовать std::string. Вы можете использовать UTF-8 с обычным std::strings, но имейте в виду, что они работают с байтами, а не с символами или даже с графемами. Для хорошего "начала работы" ознакомьтесь с этим вопросом и его ответом.

Также обратите внимание: если у вас есть строка, которая не может быть представлена ​​как ASCII, но вы все еще хотите ее в std::string, и вам не нужны символы, отличные от ASCII, вы можете использовать dataUsingEncoding:allowLossyConversion: для получения a NSData представление строки с контентом ASCII с кодировкой с потерями, а затем выбросить ее на ваш std::string

Ответ 2

Как предложил Ynau в комментарии, в общем случае было бы лучше сохранить все в стеке вместо кучи (используя new создает строку в куче), следовательно (предполагая кодировку UTF8):

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

Ответ 3

Как отмечено в philjordan.eu, также может быть, что NSString равен нулю. В таком случае бросок должен выполняться следующим образом:

//ПРИМЕЧАНИЕ: если foo is nil, это приведет к пустой строке С++

//вместо разыменования указателя NULL из UTF8String.

Это приведет вас к такому преобразованию:

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