2010-12-08 2 views
12

어떻게하면 std :: wstring을 const * char로 변환 할 수 있습니까?std :: wstring을 C++의 const * char로 변환하십시오.

+1

여러 가지가 있습니다. 어느 것이 당신에게 옳은가는 당신이 제공하지 않은 많은 사실에 달려 있습니다. 어떤 인코딩을 결과를 원하십니까? 어떤 플랫폼/인코딩 변환 lib를 사용하고 있습니까? – sbi

+0

어떤 운영 체제입니까? 적어도 Windows에서는이 작업을 수행하지 않는 것이 좋습니다. UTF-8 문자열을 파일에 쓰고 싶다면. – Philipp

+0

반드시 읽어야하는 "모든 소프트웨어 개발자 절대적으로 최소, 유니 코드와 문자 집합에 대해 절대적으로 알고 있어야합니다."(http://www.joelonsoftware.com/articles/Unicode.html) "이 있습니다. ! – Jaywalker

답변

11

당신은 c_str 멤버 함수를 사용하여 std::wstringconst wchar_t * A를 변환 할 수 있습니다 :

std::wstring s; 
const wchar_t *str = s.c_str(); 

그러나, const char *로 변환 자연되지 않습니다 : 그것은 std::wcstombs에 추가 호출이 필요합니다.

+1

wcstombs를 포함한 전체 예제를 제공 할 수 있습니까? 나는 당신이 제안한대로 이것을 풀려고 노력하고있다. –

+0

wstring이 wStr 일 때 : 'const wchar_t * str = wStr.c_str(); size_t size = wcslen (str) * 2 + 2; char * StartPoint = new char [size]; size_t c_size; wcstombs_s (& c_size, StartPoint, size, str, size); ' – arielhad

+0

@arielhad 크기 정의 끝에 +2가 표시되는 이유는 무엇입니까? 또한 크기에 대한이 '공식'은 char이 8 비트이고 wchar_t가 16 비트라고 가정합니다. 그렇지 않습니까? sizeof()를 호출하는 것이 더 좋을 것이라고 생각합니다. 모든 플랫폼에서 반드시 필요한 것은 아니기 때문입니다. – KjMag

5

이렇게하면 안됩니다. std::wstring은 넓은 (유니 코드) 문자의 문자열을 나타내며 char*은 ASCII 문자의 문자열입니다. 유니 코드에서 ASCII 로의 코드 페이지 변환이 있어야합니다.

wcstombs 또는 Windows 'WideCharToMultiByte 기능과 같은 표준 라이브러리 기능을 사용할 수 있습니다.

은 의견을 통해 정보를 통합하여 업데이트했습니다. 감사합니다.

+1

표준 라이브러리가이를 처리합니다. 예를 들어'wcrtomb','wcsrtombs'를보십시오. – nothrow

+1

@Yossarian : 표준 라이브러리 함수의 문제점은 표준이 어떤 와이드 문자 세트를 정의하지 않으며 어떤 멀티 바이트 문자 세트가'wcstombs'에서 사용되는지 정의하지 않는다는 것입니다. 특정 인코딩 (예 : UTF-8)에서 문자열을 가져와야하는 경우 직접 변환을 작성하거나 플랫폼 특정 확장 (예 : WideCharToMultiByte)을 사용해야합니다. –

+0

std :: string은 UTF- 8 및 std :: wstring은 UTF-16/UTF-32와 결혼하지 않습니다. 그래서 이것은 매우 오해의 소지가있는 대답입니다. – anno

관련 문제