std :: string을 NSString으로 변환하는 방법?


97

안녕 난 표준 변환하려고 std::stringNSString하지만 난 많은 행운을 가지고 있지 않다.

다음 코드 NSString를 사용하여 에서으로 성공적으로 변환 할 수 있습니다.std::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
오타 여야하지만 'NSString * realm = "Hollywood";'의 문자열 리터럴에 '@'가 없습니다. 선.
Vladimir

답변:


111

변환을 위해 std :: string에서 c-string을 가져옵니다.

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];

문서에 나와 있듯이 이것은 좋은 대답이 아닌 것 같습니다. / * 사용자의 기본 언어 및 잠재적으로 다른 요인에서 값이 파생되는 사용자 종속 인코딩. 다른 힌트가없는 경우 인코딩을 알 수없는 사용자 문서를 해석 할 때이 인코딩을 사용해야 할 수 있습니다. 이 인코딩은 거의 사용하지 않아야합니다. 여기에있는 일부 잠재적 값은 매우 간단한 NSString 콘텐츠 (예 : 양방향 인코딩을 사용하는 구두점 문자)의 예기치 않은 인코딩 변환을 초래할 수 있습니다. * /
cyrilchampier 2012

30
[NSString stringWithUTF8String : mystring.c_str ()]이 더 적절 해 보입니다. std :: string은 UTF8 일 가능성이 높은 자체 코드에서 나올 가능성이 더 높기 때문입니다.
cyrilchampier 2012

왜 여기에 ( developer.apple.com/documentation/foundation/nsstring/… ) "반환 된 객체가 원래 수신자와 다를 수 있습니다"라고 말하는지 아십니까 ? 이것은 무엇을 의미하며 다른지 어떻게 알 수 있습니까?
isJulian00 19-04-06

@cyrilchapier .mm 파일에 "특정 인코딩이 지정되지 않음"이라고 표시되면 어떻게됩니까?
isJulian00 19-04-06

53

첫째, 이것이 조금이라도 작동하려면 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

그 자리에서 (그리고 적절하게 #imported) 당신은 이제 다음을 할 수 있습니다 :

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

그리고에도 똑같이 std::wstring편리합니다.


1
이것은 rad이며 몇 가지 아이폰 프로젝트에서 사용했습니다. 내가 알아 차린 한 가지는 내가 Apple의 단위 테스트 프레임 워크를 실행 중이고 이러한 메서드를 활용하는 라이브러리를 테스트하는 경우 "Build Phases"의 "Compile Sources"중 하나로 문자열 변환 메서드가 포함 된 파일을 포함해야한다는 것입니다. 단위 테스트. 기묘한.
David

1
네, 단위 테스트는 본질적으로 자체의 작은 프로그램이며 동일한 코드에 액세스 할 수 있어야합니다. 또한 실제로 테스트 작성에 대한
찬사

1
왜 여기에 ( developer.apple.com/documentation/foundation/nsstring/… ) "반환 된 객체가 원래 수신자와 다를 수 있습니다"라고 말하는지 아십니까 ? 이것은 무엇을 의미하며 다른지 어떻게 알 수 있습니까?
isJulian00 19-04-06

1
@izzyMachado 문서에있는 그런 종류의 언어는 일반적으로 인터페이스 계약에 따라 입력 문자열을 구문 분석, 삭제 또는 정규화 할 수있는 "권한"을 보유한다는 것을 의미합니다. 즉, 왕복하지 않고 여전히 비교할 수 ==있지만 오히려 그들이 만들 수있는 "가장 가까운"또는 "가장 좋은"표현 일 수 있습니다. 이 경우 수신자는 NSString클래스 구현이고 반환 된 값은 Objective-C 개체가 아니므로 일부 표준 언어로이를 포함 할 수도 있습니다.
rvalue

initWithUTF8String을 사용하고 문자열에 utf8이 아닌 문자가 포함되어있을 때 이것이 왜 여전히 작동하는지 아십니까? 어떻게 문자열을 사용할 수 있고 (민트 UTF-8 인 경우) NSString이되면 출력 할 수 있습니까?
isJulian00

21
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];

이것은 NSString UTF8을 만드는가? 또는 NSString은 어떤 인코딩입니까?
isJulian00

14

이제 Apple은이 변환을 수행하기를 원하는 새로운 방법을 제공합니다. XCode7에서는 편집> 변환> 현대 목표 C 구문으로 ... 옵션을 사용하여이를 알아 냈습니다. 속기 @ 기호를 사용합니다.

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());

3

또한 다음을 발견했습니다.

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

챔피언처럼 작동합니다.


3
그것은 매우 안전하지 않으며 작동이 보장되지 않습니다. std :: string이 C ++ 객체 인 경우 standardString입니다. C ++ 객체는 가변 함수로 전달하기에 안전하지 않습니다 (변형 템플릿은 C ++ 11에서이 문제를 해결합니다). 그것이 작동한다면 그것은 우연이며 거의 모든 컴파일러는 적어도 이것을 수행하는 것에 대해 경고합니다 (시작하는 것이 오류가 아닌 경우).
비탈리

3

다음은 코드 조각 / 예입니다.

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.