WideCharToMultiByte를 올바르게 사용하는 방법
WideCharToMultiByte에 대한 설명서를 읽었 지만이 매개 변수에 갇혀 있습니다.
lpMultiByteStr
[out] Pointer to a buffer that receives the converted string.
변수를 올바르게 초기화하고 함수에 공급하는 방법을 잘 모르겠습니다.
다음은 WideCharToMultiByte 및 MultiByteToWideChar를 사용하여 데이터 손실을 방지하기 위해 utf8을 사용하여 std :: wstring 및 std :: string간에 변환하는 몇 가지 함수 (Brian Bondy의 예를 기반으로 함)입니다.
// Convert a wide Unicode string to an UTF8 string
std::string utf8_encode(const std::wstring &wstr)
{
if( wstr.empty() ) return std::string();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo( size_needed, 0 );
WideCharToMultiByte (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
// Convert an UTF8 string to a wide Unicode String
std::wstring utf8_decode(const std::string &str)
{
if( str.empty() ) return std::wstring();
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
std::wstring wstrTo( size_needed, 0 );
MultiByteToWideChar (CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
return wstrTo;
}
Brian R. Bondy가 제공 한 답변 에 대해 자세히 설명 : 다음은 소스 문자열의 와이드 문자 수에 맞게 출력 버퍼의 크기를 조정할 수없는 이유를 보여주는 예입니다.
#include <windows.h>
#include <stdio.h>
#include <wchar.h>
#include <string.h>
/* string consisting of several Asian characters */
wchar_t wcsString[] = L"\u9580\u961c\u9640\u963f\u963b\u9644";
int main()
{
size_t wcsChars = wcslen( wcsString);
size_t sizeRequired = WideCharToMultiByte( 950, 0, wcsString, -1,
NULL, 0, NULL, NULL);
printf( "Wide chars in wcsString: %u\n", wcsChars);
printf( "Bytes required for CP950 encoding (excluding NUL terminator): %u\n",
sizeRequired-1);
sizeRequired = WideCharToMultiByte( CP_UTF8, 0, wcsString, -1,
NULL, 0, NULL, NULL);
printf( "Bytes required for UTF8 encoding (excluding NUL terminator): %u\n",
sizeRequired-1);
}
그리고 출력 :
Wide chars in wcsString: 6
Bytes required for CP950 encoding (excluding NUL terminator): 12
Bytes required for UTF8 encoding (excluding NUL terminator): 18
You use the lpMultiByteStr [out] parameter by creating a new char array. You then pass this char array in to get it filled. You only need to initialize the length of the string + 1 so that you can have a null terminated string after the conversion.
Here are a couple of useful helper functions for you, they show the usage of all parameters.
#include <string>
std::string wstrtostr(const std::wstring &wstr)
{
// Convert a Unicode string to an ASCII string
std::string strTo;
char *szTo = new char[wstr.length() + 1];
szTo[wstr.size()] = '\0';
WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, szTo, (int)wstr.length(), NULL, NULL);
strTo = szTo;
delete[] szTo;
return strTo;
}
std::wstring strtowstr(const std::string &str)
{
// Convert an ASCII string to a Unicode String
std::wstring wstrTo;
wchar_t *wszTo = new wchar_t[str.length() + 1];
wszTo[str.size()] = L'\0';
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo, (int)str.length());
wstrTo = wszTo;
delete[] wszTo;
return wstrTo;
}
--
Anytime in documentation when you see that it has a parameter which is a pointer to a type, and they tell you it is an out variable, you will want to create that type, and then pass in a pointer to it. The function will use that pointer to fill your variable.
So you can understand this better:
//pX is an out parameter, it fills your variable with 10.
void fillXWith10(int *pX)
{
*pX = 10;
}
int main(int argc, char ** argv)
{
int X;
fillXWith10(&X);
return 0;
}
참고URL : https://stackoverflow.com/questions/215963/how-do-you-properly-use-widechartomultibyte
'Program Tip' 카테고리의 다른 글
Java 8 람다 목록에서 요소 가져 오기 및 제거 (0) | 2020.12.06 |
---|---|
Beanstalk : Node.js 배포-권한 거부로 인해 node-gyp 실패 (0) | 2020.12.06 |
마우스 오른쪽 버튼 클릭에 이벤트 바인딩 (0) | 2020.12.06 |
$ (document) .ready ()가 모두 실행 된 후 이벤트가 있습니까? (0) | 2020.12.06 |
phpMyAdmin에서 가져 오기 크기 제한을 늘리는 방법 (0) | 2020.12.06 |