首先,为了使这个方法生效,你必须使用 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
),现在您可以:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
对于std::wstring
同样适用,这非常方便。