Как преобразовать std:: string в NSString?
Привет я пытаюсь преобразовать стандартный 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 ответов
получить C-string из std:: string для преобразования:
NSString *errorMessage = [NSString stringWithCString:REALM.c_str()
encoding:[NSString defaultCStringEncoding]];
во-первых, вы должны использовать 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
, что более чем удобно.
Apple теперь имеет новый способ, которым они хотят, чтобы вы сделали это преобразование. В XCode7 я использовал синтаксис Edit > Convert > To Modern Objective C... возможность узнать это. Он использует сокращенный символ"@".
std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
Я обнаружил, что:
NSString *nsString = [NSString stringWithFormat:@"%s",standardString];
работает как чемпион.
вот фрагмент кода/пример:
string str_simple = "HELLO WORLD";
//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
encoding:[NSString defaultCStringEncoding]];
NSLog(stringinObjC);