첫째, 이것이 조금이라도 작동하려면 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은 라틴어가 아닌 문자를 '그냥 작동'하는 좋은 결과를 제공합니다.
더 큰 앱을 만들고 있거나 그 앱에서 작업하는 유일한 사람이 아니라면 적용하기 더 쉬운 것을 원할 것입니다.
에서 적응 코코아-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
편리합니다.