MultiByteToWideChar 함수(stringapiset.h)
문자열을 UTF-16(와이드 문자) 문자열에 매핑합니다. 문자열이 반드시 멀티바이트 문자 집합에서 온 것은 아닙니다.
통사론
int MultiByteToWideChar(
[in] UINT CodePage,
[in] DWORD dwFlags,
[in] _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
[in] int cbMultiByte,
[out, optional] LPWSTR lpWideCharStr,
[in] int cchWideChar
);
매개 변수
[in] CodePage
변환을 수행하는 데 사용할 코드 페이지입니다. 이 매개 변수는 운영 체제에 설치되거나 사용 가능한 모든 코드 페이지의 값으로 설정할 수 있습니다. 코드 페이지 목록은 코드 페이지 식별자참조하세요. 애플리케이션은 다음 표에 표시된 값 중 하나를 지정할 수도 있습니다.
[in] dwFlags
변환 형식을 나타내는 플래그입니다. 애플리케이션은 다음 값의 조합을 지정할 수 있으며 MB_PRECOMPOSED 기본값입니다. MB_PRECOMPOSED 및 MB_COMPOSITE 함께 사용할 수 없습니다. MB_USEGLYPHCHARS 및 MB_ERR_INVALID_CHARS 다른 플래그의 상태에 관계 없이 설정할 수 있습니다.
값 | 의미 |
---|---|
MB_COMPOSITE | 항상 분해된 문자, 즉 기본 문자와 하나 이상의 간격이 없는 문자 각각에 고유한 코드 포인트 값이 있는 문자를 사용합니다. 예를 들어 Ä는 A + : LATIN CAPITAL LETTER A(U+0041) + COMBINING DIAERESIS(U+0308)로 표시됩니다. 이 플래그는 MB_PRECOMPOSED 사용할 수 없습니다. |
MB_ERR_INVALID_CHARS | 잘못된 입력 문자가 발견되면 실패합니다. Windows Vista부터 애플리케이션이 이 플래그를 설정하지 않으면 함수가 잘못된 코드 포인트를 삭제하지 않고 잘못된 시퀀스를 U+FFFD(지정된 코드 페이지에 적절하게 인코딩됨)로 바꿉니다. WINDOWS 2000 SP4 이상과 Windows XP: 이 플래그를 설정하지 않으면 함수는 자동으로 잘못된 코드 포인트를 삭제합니다. GetLastError |
- MB_PRECOMPOSED
- MB_USEGLYPHCHARS
아래에 나열된 코드 페이지의 경우 dwFlags0
설정해야 합니다. 그렇지 않으면 함수가 ERROR_INVALID_FLAGS함께 실패합니다.
- 50220
- 50221
- 50222
- 50225
- 50227
- 50229
- 57002~57011
- 65000(UTF-7)
- 42(기호)
메모
UTF-8 또는 코드 페이지 54936(windows Vista부터 GB18030)의 경우 dwFlags0
또는 MB_ERR_INVALID_CHARS설정해야 합니다. 그렇지 않으면 함수가 ERROR_INVALID_FLAGS함께 실패합니다.
[in] lpMultiByteStr
변환할 문자열에 대한 포인터입니다.
[in] cbMultiByte
lpMultiByteStr 매개 변수로 표시된 문자열의 크기(바이트)입니다. 또는 문자열이 null로 종료된 경우 이 매개 변수를 -1 설정할 수 있습니다.
cbMultiByte0
경우 함수가 실패합니다.
이 매개 변수가 -1이면 함수는 종료 null 문자를 포함하여 전체 입력 문자열을 처리합니다. 따라서 결과 유니코드 문자열에는 종료 null 문자가 있으며 함수에서 반환하는 길이에는 이 문자가 포함됩니다.
이 매개 변수를 양의 정수로 설정하면 함수는 지정된 바이트 수를 정확하게 처리합니다. 제공된 크기에 종료 null 문자가 포함되지 않은 경우 결과 유니코드 문자열은 null로 종료되지 않으며 반환된 길이에는 이 문자가 포함되지 않습니다.
[out, optional] lpWideCharStr
변환된 문자열을 수신하는 버퍼에 대한 포인터입니다.
[in] cchWideChar
lpWideCharStr0
경우 함수는 종료되는 null 문자를 포함하여 필요한 버퍼 크기를 문자 단위로 반환하고 lpWideCharStr 버퍼를 사용하지 않습니다.
반환 값
성공하면 lpWideCharStr 표시된 버퍼에 기록된 문자 수를 반환합니다. 함수가 성공하고 cchWideChar
함수는 성공하지 못하면 0
반환합니다. 확장 오류 정보를 가져오기 위해 애플리케이션은 다음 오류 코드 중 하나를 반환할 수 있는 GetLastError호출할 수 있습니다.
-
ERROR_INSUFFICIENT_BUFFER: 제공된 버퍼 크기가 충분히 크지 않거나
NULL
잘못 설정되었습니다. - ERROR_INVALID_FLAGS: 플래그에 제공된 값이 잘못되었습니다.
- ERROR_INVALID_PARAMETER: 매개 변수 값이 잘못되었습니다.
- ERROR_NO_UNICODE_TRANSLATION: 문자열에서 잘못된 유니코드가 발견되었습니다.
발언
이 함수의 기본 동작은 미리 구성된 형식의 입력 문자열로 변환하는 것입니다. 미리 컴파일된 양식이 없으면 함수는 복합 폼으로 변환하려고 시도합니다.
대부분의 입력 데이터가 이미 구성되었기 때문에 MB_PRECOMPOSED 플래그를 사용하는 것은 대부분의 코드 페이지에 거의 영향을 미치지 않습니다. MultiByteToWideChar사용하여 변환한 후 NormalizeString 호출하는 것이 좋습니다. NormalizeString 보다 정확하고 표준적이고 일관된 데이터를 제공하며 더 빠를 수도 있습니다. NormalizeString전달되는 NORM_FORM 열거형의 경우 NormalizationC는 MB_PRECOMPOSED 해당하고 NormalizationD는 MB_COMPOSITE 해당합니다.
위의 주의 사항에서 설명한 것처럼 이 함수가 필요한 크기를 얻기 위해 0
cchWideChar 처음 호출되지 않은 경우 출력 버퍼를 쉽게 오버런할 수 있습니다. MB_COMPOSITE 플래그를 사용하는 경우 출력은 각 입력 문자에 대해 세 개 이상의 문자가 될 수 있습니다.
lpMultiByteStr 및 lpWideCharStr 포인터는 동일하지 않아야 합니다. 동일한 경우 함수가 실패하고 GetLastError ERROR_INVALID_PARAMETER 값을 반환합니다.
입력 문자열 길이가 종료 null 문자 없이 명시적으로 지정된 경우 MultiByteToWideChar 출력 문자열을 null로 종료하지 않습니다. 이 함수에 대한 출력 문자열을 null로 종료하려면 애플리케이션이 -1 전달하거나 입력 문자열의 종료 null 문자를 명시적으로 계산해야 합니다.
MB_ERR_INVALID_CHARS 설정되고 원본 문자열에서 잘못된 문자가 발견되면 함수가 실패합니다. 잘못된 문자는 다음 중 하나입니다.
- 원본 문자열의 기본 문자는 아니지만 MB_ERR_INVALID_CHARS 설정되지 않은 경우 기본 문자로 변환되는 문자입니다.
- DBCS 문자열의 경우 리드 바이트가 있지만 유효한 내역 바이트가 없는 문자입니다.
Windows Vista부터 이 함수는 UTF-8 및 UTF-16에 대한 유니코드 4.1 사양을 완벽하게 준수합니다. 이전 운영 체제에서 사용된 함수는 서로게이트 반쪽 또는 일치하지 않는 서로게이트 쌍을 인코딩하거나
Windows 8부터:MultiByteToWideCharStringapiset.h
선언됩니다. Windows 8 이전에는 Winnls.h
선언되었습니다.
코드 예제
catch (std::exception e)
{
// Save in-memory logging buffer to a log file on error.
::std::wstring wideWhat;
if (e.what() != nullptr)
{
int convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), NULL, 0);
if (convertResult <= 0)
{
wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
wideWhat += convertResult.ToString()->Data();
wideWhat += L" GetLastError()=";
wideWhat += GetLastError().ToString()->Data();
}
else
{
wideWhat.resize(convertResult + 10);
convertResult = MultiByteToWideChar(CP_UTF8, 0, e.what(), (int)strlen(e.what()), &wideWhat[0], (int)wideWhat.size());
if (convertResult <= 0)
{
wideWhat = L"Exception occurred: Failure to convert its message text using MultiByteToWideChar: convertResult=";
wideWhat += convertResult.ToString()->Data();
wideWhat += L" GetLastError()=";
wideWhat += GetLastError().ToString()->Data();
}
else
{
wideWhat.insert(0, L"Exception occurred: ");
}
}
}
else
{
wideWhat = L"Exception occurred: Unknown.";
}
Platform::String^ errorMessage = ref new Platform::String(wideWhat.c_str());
// The session added the channel at level Warning. Log the message at
// level Error which is above (more critical than) Warning, which
// means it will actually get logged.
_channel->LogMessage(errorMessage, LoggingLevel::Error);
SaveLogInMemoryToFileAsync().then([=](StorageFile^ logFile) {
_logFileGeneratedCount++;
StatusChanged(this, ref new LoggingScenarioEventArgs(LoggingScenarioEventType::LogFileGenerated, logFile->Path->Data()));
}).wait();
}
GitHub의 Windows 유니버설 샘플 예제입니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 Professional [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows 2000 Server [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | stringapiset.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |
참고 항목
유니코드 및 문자 집합 함수
유니코드 및 문자 집합
VBS enclave에서 사용할 수 있는 Vertdll API