2016-07-01 3 views
2

문자열에서 LPCWSTR로 변환하려고합니다 (멀티 바이트 사용). 예를 들어문자열을 LPCWSTR로 C++로

1)는 :

LPCWSTR ToLPCWSTR(string text) 
{ 
    LPCWSTR sw = (LPCWSTR)text.c_str(); 
    return sw; 
} 

2)이 중국 문자를 반환 :

LPCWSTR ToLPCWSTR(string text) 
{ 
    std::wstring stemp = std::wstring(text.begin(), text.end()); 
    LPCWSTR sw = (LPCWSTR)s.c_str(); 
    return sw; 
} 

을하지만, 둘은 항상 사각형을 보여줍니다

Image

을 0

{EDITED}에 의한 편집과 내 코드 : Barmak Shemirani

std::wstring get_utf16(const std::string &str, int codepage) 
{ 
    if (str.empty()) return std::wstring(); 
    int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); 
    std::wstring res(sz, 0); 
    MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); 
    return res; 
} 

string HttpsWebRequest(string domain, string url) 
{ 
    LPCWSTR sdomain = get_utf16(domain, CP_UTF8).c_str(); 
    LPCWSTR surl = get_utf16(url, CP_UTF8).c_str(); 
    //(Some stuff...) 
} 

반환 : https://i.gyazo.com/ea4cd50765bfcbe12c763ea299e7b508.png

{EDITED} UTF16으로 UTF8에서 통과 다른 코드를 사용하여, 여전히 같은 결과 .

std::wstring utf8_to_utf16(const std::string& utf8) 
{ 
    std::vector<unsigned long> unicode; 
    size_t i = 0; 
    while (i < utf8.size()) 
    { 
     unsigned long uni; 
     size_t todo; 
     bool error = false; 
     unsigned char ch = utf8[i++]; 
     if (ch <= 0x7F) 
     { 
      uni = ch; 
      todo = 0; 
     } 
     else if (ch <= 0xBF) 
     { 
      throw std::logic_error("not a UTF-8 string"); 
     } 
     else if (ch <= 0xDF) 
     { 
      uni = ch & 0x1F; 
      todo = 1; 
     } 
     else if (ch <= 0xEF) 
     { 
      uni = ch & 0x0F; 
      todo = 2; 
     } 
     else if (ch <= 0xF7) 
     { 
      uni = ch & 0x07; 
      todo = 3; 
     } 
     else 
     { 
      throw std::logic_error("not a UTF-8 string"); 
     } 
     for (size_t j = 0; j < todo; ++j) 
     { 
      if (i == utf8.size()) 
       throw std::logic_error("not a UTF-8 string"); 
      unsigned char ch = utf8[i++]; 
      if (ch < 0x80 || ch > 0xBF) 
       throw std::logic_error("not a UTF-8 string"); 
      uni <<= 6; 
      uni += ch & 0x3F; 
     } 
     if (uni >= 0xD800 && uni <= 0xDFFF) 
      throw std::logic_error("not a UTF-8 string"); 
     if (uni > 0x10FFFF) 
      throw std::logic_error("not a UTF-8 string"); 
     unicode.push_back(uni); 
    } 
    std::wstring utf16; 
    for (size_t i = 0; i < unicode.size(); ++i) 
    { 
     unsigned long uni = unicode[i]; 
     if (uni <= 0xFFFF) 
     { 
      utf16 += (wchar_t)uni; 
     } 
     else 
     { 
      uni -= 0x10000; 
      utf16 += (wchar_t)((uni >> 10) + 0xD800); 
      utf16 += (wchar_t)((uni & 0x3FF) + 0xDC00); 
     } 
    } 
    return utf16; 
} 

답변

1

경우 . 그러나 일반적으로 당신은 당신은 소스 문자열을 만들기 위해 사용되는 코드 페이지를 알 필요가 MultiByteToWideChar

std::wstring get_utf16(const std::string &str, int codepage) 
{ 
    if (str.empty()) return std::wstring(); 
    int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); 
    std::wstring res(sz, 0); 
    MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); 
    return res; 
} 

사용해야합니다. GetACP()을 사용하여 사용자 컴퓨터의 코드 페이지를 찾을 수 있습니다. 소스 문자열이 UTF8이면 코드 페이지로 CP_UTF8을 사용하십시오.

+0

UTF8이지만 여전히 중국어와 사각형을 반환합니다. – Jose

+0

U는 일반적으로 다음과 같은 문자열을 설정합니다. string url = u8 "/ post/show/933477 /"; 항상 실패 – Jose

+0

수정 됨, 요청 내에 "c_str()"을 추가해야했습니다. – Jose

3

두 가지 문제가 있습니다.

  1. LPCWSTRwchar_t에 대한 포인터이며, std::string::c_str()const char*를 반환합니다. 두 유형이 다르므로 const char*에서 LPCWSTR으로 전송하는 기능이 작동하지 않습니다.
  2. std::basic_string::c_str에 의해 반환 된 포인터가 가리키는 메모리는 문자열 개체가 소유하며 문자열이 범위를 벗어날 때 해제됩니다.

메모리를 할당하고 문자열 사본을 만들어야합니다.

새로운 와이드 문자열에 메모리를 할당하는 가장 쉬운 방법은 std::wstring을 반환하는 것입니다. 그런 다음 어떤 API 함수에 c_str()에 의해 반환 된 포인터를 전달할 수있는 것은 LPCWSTRstd::string 소스 (마일 Budnek의 대답에서와 같이) 다음 std::wstring로 변환이 간단한 복사와 함께 할 수있는 영어 또는 일부 라틴어입니다

std::wstring string_to_wstring(const std::string& text) { 
    return std::wstring(text.begin(), text.end()); 
} 
+0

디렉토리가있는 도메인 이름을 반환하지만 중국어와 정사각형은 다시 나타납니다. 나는 당신의 코드를 사용하고 c_str() 변환을 만들었다. https://i.gyazo.com/ea4cd50765bfcbe12c763ea299e7b508.png – Jose

+0

@Miles Budnek : std :: string & str ==> 텍스트를 수정하여 반환 선 (text.begin() ...과 일치하도록하십시오.) –