Как мне преобразовать NSString в std::string?
У меня есть NSString
объект и хотите превратить его в std::string
,
Как мне сделать это в Objective-C++?
3 ответа
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
Как предложил Ynau в комментарии, в общем случае было бы лучше хранить все в стеке, а не в куче (используя new
создает строку в куче), следовательно (при условии кодировки UTF8):
NSString *foo = @"Foo";
std::string bar([foo UTF8String]);
Как отмечается на сайте philjordan.eu, возможно, что NSString nil
, В таком случае приведение должно быть сделано так:
// ПРИМЕЧАНИЕ: если foo равен nil, это приведет к пустой строке C++
// вместо разыменования пустого указателя из UTF8String.
Это привело бы вас к такому преобразованию:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);