Как мне преобразовать NSString в std :: string? - PullRequest
91 голосов
/ 04 ноября 2011

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

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

Ответы [ 3 ]

126 голосов
/ 04 ноября 2011
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

50 голосов
/ 18 февраля 2014

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

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);
6 голосов
/ 24 мая 2017

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

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

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

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

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