Как конвертировать std :: string в NSString? - PullRequest
88 голосов
/ 24 августа 2010

Привет, я пытаюсь преобразовать стандарт std::string в NSString, но мне не очень повезло.

Я могу успешно конвертировать из NSString в std::string с помощью следующего кода

NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];

Однако я получаю ошибку во время компиляции при попытке выполнить следующее

NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];

Я получаю ошибку

Cannot convert 'std::string' to 'const char*' in argument passing

Я что-то здесь упускаю?

Заранее спасибо.

Ответы [ 6 ]

99 голосов
/ 24 августа 2010

Получить c-строку из std :: string для преобразования:

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];
47 голосов
/ 15 сентября 2011

Во-первых, вы должны использовать Objective-C ++, чтобы это работало в малейшей степени;Самый простой способ обеспечить переименование всех ваших *.m файлов в *.mm

На сегодняшний день самый удобный (не осуждаемый) ручной способ получения C ++ std::string в NSString - это:

std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];

В большинстве случаев это будет работать - и если вы не будете выполнять определенное обнаружение и преобразование кодировки, UTF-8 даст вам хороший результат за то, что нелатинские символы просто работают.'

Если вы создаете более крупное приложение или работаете не только над ним, тем не менее - вы, вероятно, захотите что-то, что будет проще в применении.

Адаптировано из архивы списков рассылки cocoa-dev

@interface NSString (cppstring_additions)
+(NSString*) stringWithwstring:(const std::wstring&)string;
+(NSString*) stringWithstring:(const std::string&)string;
-(std::wstring) getwstring;
-(std::string) getstring;
@end

@implementation NSString (cppstring_additions)

#if TARGET_RT_BIG_ENDIAN
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32BE);
#else
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
#endif

+(NSString*) stringWithwstring:(const std::wstring&)ws
{
    char* data = (char*)ws.data();
    unsigned size = ws.size() * sizeof(wchar_t);

    NSString* result = [[NSString alloc] initWithBytes:data length:size encoding:kEncoding_wchar_t];
    return result;
}
+(NSString*) stringWithstring:(const std::string&)s
{
    NSString* result = [[NSString alloc] initWithUTF8String:s.c_str()];
    return result;
}

-(std::wstring) getwstring
{
    NSData* asData = [self dataUsingEncoding:kEncoding_wchar_t];
    return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
-(std::string) getstring
{
    return [self UTF8String];
}

@end

С этим на месте (и соответственно #import ed) вы можете теперь:

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];

И то же самое дляstd::wstring, что более чем удобно.

19 голосов
/ 04 декабря 2013
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
13 голосов
/ 03 февраля 2016

У Apple теперь есть новый способ, которым они хотят, чтобы вы сделали это преобразование.В XCode7 я использовал опцию Edit> Convert> To Modern Objective C Syntax ..., чтобы выяснить это.Используется сокращенный символ @.

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
3 голосов
/ 12 января 2012

Я также обнаружил, что:

NSString *nsString = [NSString stringWithFormat:@"%s",standardString];

Работает как чемпион.

2 голосов
/ 13 августа 2016

Вот фрагмент кода / пример:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
...