it-swarm.com.ru

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

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

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

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

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

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

126
JustSid

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

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

Как отмечено на philjordan.e , также может быть, что строка NSString - nil. В таком случае приведение должно быть сделано так:

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

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

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

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