NSString을 std :: string으로 어떻게 변환합니까?


답변:


134
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);

편집 : 몇 년 후이 답변을 확장하겠습니다. 정당하게 지적했듯이 .NET을 사용하려는 경우 cStringUsingEncoding:with 를 사용하고 싶을 NSASCIIStringEncodingstd::string입니다. normal과 함께 UTF-8을 사용할 수 std::strings있지만 문자 또는 문자가 아닌 바이트에서 작동합니다. 좋은 "시작"을 위해이 질문과 대답을 확인하십시오 .

또한 ASCII로 표현할 수없는 문자열이 있지만 여전히에서 원하고 std::stringASCII가 아닌 문자를 원하지 않는 경우을 사용 dataUsingEncoding:allowLossyConversion:하여 NSData손실 인코딩 된 ASCII가있는 문자열 표현 을 얻을 수 있습니다. 콘텐츠, 그리고 당신의std::string


13
인코딩에주의하십시오. UTF-8이 일반적으로 좋은 선택이지만, 작업중인 API가 순수 ASCII 또는 시스템 코드 페이지를 예상하는 경우 -cStringUsingEncoding:대신 사용해야 합니다. :)
Jonathan Grynspan 2011

13
삭제하지 않으면 메모리 누수가 발생하며 반환 된 포인터는 Objective-C 참조 계산 개체가 아닙니다. 일반적으로 std :: string에 new operator를 사용하지 않아야합니다.
SiimKallas 2014 년

이것은 받아 들여진 대답이 아니어야하며 변환을 할 때 가장 먼저 고려해야 할 사항이 아닙니다.
JBL

@JBL 4 년 몇 주 만에 답을 넓히기 위해 다녔습니다. 이제 좀 더 받아 들일 수 있기를 바랍니다.
JustSid

@JustSid 내 의견을 정확하게 작성해야했지만 다른 문제는 기본적으로 포인터를 사용하는 것입니다. 사실, ObjC 배경이 있고 C ++ 지식이없는 동료가 삭제하지 않고 메모리 누수로 끝나는 것을 사용했습니다. 그리고 더 일반적으로; wild new는 눈살을 찌푸리게되며 std::shared_ptr또는 a를 std::unique_ptr선호해야합니다.
JBL

50

Ynau가 주석에서 제안했듯이 일반적으로 힙 대신 스택에 모든 것을 유지하는 것이 좋습니다 (사용하여 힙 new에 문자열 생성), 따라서 (UTF8 인코딩 가정).

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);

8

philjordan.eu에서 언급했듯이 NSString이 nil. 이러한 경우 캐스트는 다음과 같이 수행되어야합니다.

// 참고 : foo가 nil이면 빈 C ++ 문자열이 생성됩니다.

// UTF8String에서 NULL 포인터를 역 참조하는 대신.

이것은 다음과 같은 전환으로 이어질 것입니다.

NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

1
이것은 매우 유용합니다. 거의 모든 사람을보고 싶어서 간과하고 있습니다. 너네들 NIL에 충돌이 일어나.
P i
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.