まず、これを少しでも機能させるには、Objective-C++を使用する必要があります。それを確実にする最も簡単な方法は、すべての*.m
ファイルの名前を次のように変更することです*.mm
std::string
C ++をに導入するための最も使いやすい(非推奨ではない)手動の方法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
、便利以上のものです。