103

嗨,我正在尝试将标准转换为标准std::stringNSString但运气不佳。

我可以使用以下代码成功地从NSStringa 转换为 astd::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

我在这里错过了什么吗?

提前致谢。

4

6 回答 6

118

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

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];
于 2010-08-23T22:33:07.917 回答
55

首先,你必须使用 Objective-C++ 才能让它工作。确保将所有*.m文件重命名为的最简单方法*.mm

到目前为止,将 C++std::string放入 an的最有用(不弃用)的手动方法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编辑),您现在可以:

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

和同样的std::wstring,这不仅仅是方便。

于 2011-09-15T01:36:28.000 回答
25
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
于 2013-12-03T22:27:28.437 回答
17

苹果现在有了一种新的方式,他们希望你进行这种转换。在 XCode7 中,我使用了 Edit > Convert > To Modern Objective C Syntax... 选项来找出答案。它使用速记 @ 符号。

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
于 2016-02-03T20:03:57.257 回答
4

我还发现:

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

像冠军一样工作。

于 2012-01-11T22:05:33.087 回答
4

这是代码片段/示例:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
于 2016-08-13T06:53:10.597 回答