C ++ (유니 코드)에서 std :: string을 LPCWSTR로 변환하는 방법


115

std :: string을 LPCWSTR로 변환하는 방법 또는 코드 스 니펫을 찾고 있습니다.


1
반대로 어떻게합니까?
Sohaib

나는 그 반대를 시도하는 구글에서왔다. 방법을 찾지 못 하셨나요?
Tomáš Zato-Monica 복원

답변:


134

MSDN 기사에 대한 링크에 감사드립니다. 이것이 바로 제가 찾던 것입니다.

std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

std::wstring stemp = s2ws(myString);
LPCWSTR result = stemp.c_str();

4
(무작위로 검색하는이 질문을 찾았습니다. C ++을 사용한 지 오래되었습니다.) 표준 라이브러리에는 std :: string-> std :: wstring 변환이 없습니다. 이상해 보입니다. 타당한 이유가 있습니까?
Domenic

5
std :: vector <wchar_t>를 사용하여 buf에 대한 스토리지를 생성하면 예외가 발생하면 임시 버퍼가 해제됩니다.
Jason Harrison

81
왜 C ++가 나를 짜증나게하는지에 대한 이유 # 233. 간단한 문자열 변환을위한 코드 10 줄 = /
b1nary.atr0phy

2
또는 wstring ws (s.begin (), s.end ()) ...?
CJBrew 2012

3
@CJBrew : 모든 문제에 대해 깨끗하고 우아하고 잘못된 해결책이 있습니다. 귀하의 입력은 ANSI가 아닌 ASCII 문자 만 포함 한다는 가정을 기반으로합니다 .
IInspectable 2016 년

121

솔루션은 실제로 다른 제안보다 훨씬 쉽습니다.

std::wstring stemp = std::wstring(s.begin(), s.end());
LPCWSTR sw = stemp.c_str();

무엇보다도 플랫폼 독립적입니다. h2h :)


2
Benny에게 미안하지만 그것은 나를 위해 작동하지 않습니다. Toran의 자체 솔루션은 잘 작동하는 것 같습니다 (그러나 ..blegh!).
Iain Collins

32
모든 문자가 단일 바이트 인 경우에만 작동합니다 (예 : ASCII 또는 ISO-8859-1) . UTF-8을 포함하여 모든 멀티 바이트는 비참하게 실패합니다.
Mark Ransom 2013 년

첫 줄을 다음과 같이 단순화 할 수 있다고 생각합니다. std :: wstring stemp (s.begin (), s.end ()); 그러면 가능한 사본이 제거되고 더 간단 해 보입니다. 컴파일러 어쨌든 복사본을 제거 할 있지만 이것은 여전히 ​​더 간단한 모양입니다.
Kit10 2011 년

13
주님, 모든 찬성표는 무엇입니까? 이 답변은 때때로 우연의 일치로 작동합니다 . 문자 인코딩을 완전히 무시합니다 . 당신은 단순히 좁은 문자를 넓힐 수 없으며, 그것이 동일한 코드 포인트를 나타내는 넓은 문자로 마술처럼 변하기를 희망합니다. 그것은 도덕적으로 reinterpret_cast. 이 코드는 작동하지 않습니다. 사용하지 마세요. .
IInspectable

2
@nik : Windows에서 a char는 일반적으로 ANSI로 인코딩됩니다. ANSI 인코딩을 사용하면 128에서 255까지의 값이 현재 활성 코드 페이지를 사용하여 해석됩니다. 이러한 값을 wchar_t(Windows의 경우 UTF-16 인코딩)으로 밀어 넣으면 원하는 결과가 생성되지 않습니다. 정확하고 싶다면 정확히 50 %의 경우에서 작동합니다. DBCS 문자 인코딩을 고려하면 해당 백분율이 더 감소합니다.
IInspectable 2010 년

9

ATL / MFC 환경에있는 경우 ATL 변환 매크로를 사용할 수 있습니다.

#include <atlbase.h>
#include <atlconv.h>

. . .

string myStr("My string");
CA2W unicodeStr(myStr);

그런 다음 unicodeStr을 LPCWSTR로 사용할 수 있습니다. 유니 코드 문자열에 대한 메모리가 스택에 생성되고 해제 된 다음 unicodeStr에 대한 소멸자가 실행됩니다.


0

std :: string을 사용하는 대신 std :: wstring을 사용할 수 있습니다.

편집 : 미안하지만 더 설명이 필요하지는 않지만 실행해야합니다.

std :: wstring :: c_str () 사용


9
Q : "X에서 Y로 변환해야합니다." - A : "그들이 대신 X.의를 사용하는 작업을위한 봐" 이것은 쓸모가 없습니다.
IInspectable

모든 나무의 숲을 볼 수 없습니까? 이것은 내가 찾던 것과 정확히 일치하기 때문에 유용합니다.
Charlie

-3
string  myMessage="helloworld";
int len;
int slength = (int)myMessage.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, 0, 0); 
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, myMessage.c_str(), slength, buf, len);
std::wstring r(buf);
 std::wstring stemp = r.C_str();
LPCWSTR result = stemp.c_str();

-3

LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). c_str ()


2
이 솔루션은 이미 최고의 답변 중 하나에 의해 9 년 ago 제안되었다
니노 Filiu을

1
그리고 9 년 전부터 오늘날까지도 그랬습니다. 주석은 왜 이것이 좁은 범위의 코드 단위에서만 작동하는지 설명합니다.
IInspectable
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.