如何将std :: string转换为NSString?

Ant*_*ick 90 objective-c stdstring objective-c++ nsstring

嗨,我正在尝试将标准std::string转换成一个,NSString但我没有太多运气.

我可以使用以下代码成功地从NSStringa 转换为astd::string

NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以下操作时,我收到编译时错误

NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

Cannot convert 'std::string' to 'const char*' in argument passing
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

提前致谢.

Vla*_*mir 101

从std :: string中获取c-string以进行转换:

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];
Run Code Online (Sandbox Code Playgroud)

  • [NSString stringWithUTF8String:mystring.c_str()]似乎更合适,因为std :: string更可能来自您自己的代码,可能是UTF8. (29认同)

rva*_*lue 48

首先,你必须使用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()];
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都有效 - 如果你没有进行特定的编码检测和转换,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
Run Code Online (Sandbox Code Playgroud)

通过就地(并适当#import编辑),您现在可以:

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Run Code Online (Sandbox Code Playgroud)

同样的std::wstring,这是非常方便的.


Joh*_*ers 19

NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
Run Code Online (Sandbox Code Playgroud)


Vol*_*ike 13

Apple现在有了一种他们希望您进行此转换的新方式.在XCode7中,我使用了Edit> Convert> To Modern Objective C Syntax ...选项来查找它.它使用简写@符号.

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
Run Code Online (Sandbox Code Playgroud)