2016-08-13 2 views
1

vC++ 프로젝트의 "문자 집합"속성이 "다중 바이트 문자 사용"으로 설정되어 있는데 CStringW (중국어 언어 문자열)를 CString으로 변환하고 중국어 문자를 물음표로 변환합니다.CStringW를 CString으로 변환하는 결과 문

CStringA utf8; 
int cc=0; 
// get length (cc) of the new multibyte string excluding the \0 terminator first 
if ((cc = WideCharToMultiByte(CP_UTF8, 0, stringw, -1, NULL, 0, 0, 0) - 1) > 0) 
{ 
    // convert 
    char *buf = utf8.GetBuffer(cc); 
    if (buf) WideCharToMultiByte(CP_UTF8, 0, stringw, -1, buf, cc, 0, 0); 
     utf8.ReleaseBuffer(); 

제발 도와주세요, 전 C++입니다.

+0

예를 들어, 대신 CTooltipCtrl::AddTool를 사용하는 유니 코드 기능을 표시 해당하는 WinAPI를 코드를 사용할 수 있습니까? Windows에는 UTF-8 문자열을 표시하는 메커니즘이 없습니다. Windows MBCS 지원은 코드 페이지 기반입니다. –

답변

2

변환이 올바르게 작동하면 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); 
} 
+0

고마워, 당신은 정확하지만 "CToolTipListCtr"에 CStringW를 표시하는 방법을 제안하십시오. –

+0

인터넷 등으로 가져 오기/내보내기를 할 때를 제외하고는 Windows에서 UTF-8로 작업하지 않습니다. Windows는 UTF-16을 사용합니다. MFC 프로젝트가 유니 코드입니까? 프로젝트 속성 -> 문자 집합을 확인하십시오. "문자 세트"는 "유니 코드"또는 "설정되지 않음"이어야합니다. 이게 뭐야? –

+0

"멀티 바이트 문자 세트 사용"으로 설정되었습니다. –

관련 문제