변환이 올바르게 작동하면 UTF-8이 필요한 다른 프로그램으로 UTF-8 결과를 보내거나 웹 브라우저에서 테스트하거나 UTF-8 인코딩을 사용하여 메모장에서 테스트 할 수 있습니다.
유일한 문제는 Windows API가 UTF-8 문자열을 직접 표시 할 수 없으므로 실패한 것처럼 보일 수 있다는 점입니다. 예를 들어 ::MessageBoxA(0, utf8, 0, 0)
은 잘못된 결과를 표시합니다.
변환 작업을 확인하려면 UTF-16으로 다시 변환 할 수 있습니다. 예를 들어 :
#include <atlstr.h>
...
CStringW utf16 = L"汉字/漢字";
CStringA utf8 = CW2A(utf16, CP_UTF8);
CStringW copy = CA2W(utf8, CP_UTF8);
if (copy == utf16)
::MessageBoxW(0, copy, L"success", 0);
else
::MessageBoxW(0, copy, L"failed", 0);
새 Windows 프로그램은 유니 코드에 있어야합니다 (UTF-16). 멀티 바이트 및 ANSI는 더 이상 사용되지 않습니다.
이전 프로그램에서 멀티 바이트를 사용하려면 코드 페이지를
CP_ACP
또는 다른 언어로 설정하십시오. 예 :
WideCharToMultiByte(CP_ACP, ...)
. 그러나 이것은 현재 스레드의 코드 페이지에 의존하며 신뢰할 수 없습니다.
#include <iostream>
#include <atlstr.h>
#include <Windows.h>
int main()
{
//ANSI codepage for Greek language:
int codepage = 1253;
CStringW utf16 = L"ελληνική";
CStringA ansi = CW2A(utf16, codepage);
SetConsoleOutputCP(codepage);
//This should appear correctly
std::cout << ansi << "\n";
//This won't show correctly in English language computer
MessageBoxA(0, ansi, 0, 0);
return 0;
}
프로젝트는 유니 코드하지 않고, 어떤 이유로 유니 코드로 변경할 수없는 경우 마지막으로, 당신은 여전히 (예를 MessageBoxW
에 대한) 유니 코드 API의에 액세스 할 수 그래서 당신은 오래된 프로그램을 패치 할 수 있습니다. 변환이 완료된 후`utf8`에 뭐
CWnd *button = GetDlgItem(IDOK);
if (button)
{
TOOLINFOW ti;
memset(&ti, 0, sizeof(ti));
ti.cbSize = sizeof(ti);
ti.hwnd = ::GetParent(button->m_hWnd);
ti.uFlags = TTF_IDISHWND;
ti.uId = (UINT_PTR)button->m_hWnd;
ti.lpszText = L"汉字/漢字";
ToolTip->SendMessage(TTM_ADDTOOLW, 0, (LPARAM)&ti);
}
예를 들어, 대신
CTooltipCtrl::AddTool
를 사용하는 유니 코드 기능을 표시 해당하는 WinAPI를 코드를 사용할 수 있습니까? Windows에는 UTF-8 문자열을 표시하는 메커니즘이 없습니다. Windows MBCS 지원은 코드 페이지 기반입니다. –