2009-11-24 8 views
7

char* 형식의 문자열이 있는데이 문자열을 wchar_t*으로 변환하여 Windows 기능으로 전달하려고합니다.char 문자열을 wchar_t 문자열로 변환하려면 어떻게해야합니까?

+2

대부분의 Windows 기능은 실제로 두 개의 풍미하는 "A 와서 W "버전. 예 : MessageBoxA/MessageBoxW, "MessageBox"매크로 중 하나를 참조하십시오. 그러나 명시적인'MessageBoxA' 이름을 사용하면 프로젝트 설정과 관계없이'char *'를 전달할 수 있습니다. – MSalters

답변

13

이 작은 기능이 도움이됩니까? 또한

#include <cstdlib> 

int mbstowcs(wchar_t *out, const char *in, size_t size); 

는 MultiByteToWideChar API 호출, 예를 들어, C 런타임 라이브러리에 대한 링크를 사용하지 않는 경우 C++ reference

8

를 참조하십시오

const size_t WCHARBUF = 100; 
const char s[] = "HELLO"; 
wchar_t wszDest[WCHARBUF]; 
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szSource, -1, wszDest, WCHARBUF); 
+2

문자열의 출처에 따라 CP_ACP 대신 CP_UTF8을 고려할 수도 있습니다. 모든 유니 코드 문자를 저장할 수 있습니다. – asveikau

+0

Visual Studio 2017이 설치된 windows10에서 CP_ACP가 작동했습니다. CP_UTF8은 그렇지 않습니다. – netskink

2

윈도우 SDK는이 개 기능을 지정합니다 문자열을 와이드 문자 세트에서 또는 와이드 문자 세트로 변환하기위한 kernel32.lib. 그것들은 MultiByteToWideChar()WideCharToMultiByte()입니다.

제안하는 함수 이름과 달리 문자열에 반드시 멀티 바이트 문자 집합이 사용되는 것은 아니지만 간단한 ANSI 문자열이 될 수 있습니다. 또한 이러한 함수는 UTF-7 및 UTF-8을 멀티 바이트 문자 세트로 인식합니다. 넓은 char 문자 세트는 항상 UTF-16입니다.

1

schnaader의 대답은 현재 C 로케일에 의해 정의 된 변환을 사용,이 사람은 C++ 로케일 인터페이스 사용 (간단라고 말했다?)

std::wstring widen(std::string const& s, std::locale loc) 
{ 
    std::char_traits<wchar_t>::state_type state = { 0 }; 

    typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type > 
     ConverterFacet; 

    ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc)); 

    char const* nextToRead = s.data(); 
    wchar_t buffer[BUFSIZ]; 
    wchar_t* nextToWrite; 
    std::codecvt_base::result result; 
    std::wstring wresult; 

    while ((result 
      = converter.in 
        (state, 
        nextToRead, s.data()+s.size(), nextToRead, 
        buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite)) 
      == std::codecvt_base::partial) 
    { 
     wresult.append(buffer, nextToWrite); 
    } 

    if (result == std::codecvt_base::error) { 
     throw std::runtime_error("Encoding error"); 
    } 
    wresult.append(buffer, nextToWrite); 
    return wresult; 
} 
관련 문제