01
17

IMGUI 한글 깨짐

Directx 11에 툴링용으로 Imgui를 적용하였다.

하지만 Imgui는 기본적으로 멀티 바이트용으로 한글이 출력이 되지 않는다.

???로 출력이 된다.  깃헙에 제시된 여러 해결방법이 있지만,

나에게 제일 간단한 방법을 찾았다.

 

1. ImGuiIO 객체의 유니코드 한글 폰트를 추가한다.

 

 
ImGuiManager::ImGuiManager()
{
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGui::StyleColorsDark();
    ImGuiIO& io = ImGui::GetIO();
    io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\malgun.ttf"18.0f, NULL, io.Fonts->GetGlyphRangesKorean());
}
 
ImGuiManager::~ImGuiManager()
{
    ImGui::DestroyContext();
}
cs

 

ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\malgun.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesKorean());

 

 

굳이 ImGui 매니져를 사용하지 않더라도, 본인이 ImGui를 초기화하는 부분에서

호출해주면 된다. 나는 폰트는 제일 흔한 마이크로소프트 맑은 고딕을 사용했다.

io.Fonts->GetGlyphRangesKorean()로 한국어의 필요한 특정 그리프 범위를 지정해준다. 

 

2. (u8"한글 출력")

 

 
    #pragma region IMGUI INTERFACE
    if (ImGui::Begin("Chatting Box"))
    {
        
        ImGui::TextColored(color,isConnect.c_str());
        //연결이 안되어 있으면 연결 재 시도
        if (!m_Net.m_bConnect)
        {
            if (ImGui::Button(u8"연결 재시도"))
            {
                if (m_Net.Connect(g_hWnd, SOCK_STREAM, 10000, IP_DD))
                {
                    m_bConnect = true;
                }
            }
        }
        else
        {
            ImGui::BeginChild(u8"채팅창", ImVec2(0-ImGui::GetItemsLineHeightWithSpacing() - 15));
            ImGui::Text(chatItems);
            ImGui::EndChild();
            ImGui::Dummy(ImVec2(0.0f, 5));
            ImGui::InputText("", buffer, sizeof(buffer));
            ImGui::SameLine();
            if (ImGui::Button("Send"))
            {
                char clear[MAX_PATH] = { 0, };
                KPacket kPacket(PACKET_CHAT_MSG);
                kPacket << 123 << "Test" << (short)12 << buffer;
 
                //리턴 값이 0보다 작으면 전송되지 않았음
                if (m_Net.SendMsg(m_Net.m_Sock, kPacket.m_uPacket) < 0)
                {
                    ZeroMemory(&chatItems, sizeof(char* 2048);
                    strcat(chatItems, "Error\n");
                    m_Net.m_bConnect = false;
                }
 
                strcpy(buffer, clear);
            }
        }
    }
    ImGui::End();
#pragma endregion
cs

 

한글 부분에 u8를 붙여서 UTF-8 (유니코드) 글자임을 명시한다.

아마도 내부적으로 MultiBytetoWideChar() <멀티 바이트-> UTF-8>을 쓰고 있지 않을까 싶다.

이렇게 간단하게 imgui에서 한글 출력을 할 수가 있다. 

 

참고로, Win32 API로 

유니코드 -> 멀티바이트 : WideCharToMultiByte()

멀티 바이트 -> 유니코드 :  MultiBytetoWideChar()이다.

https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-widechartomultibyte

 

WideCharToMultiByte function (stringapiset.h) - Win32 apps

Maps a UTF-16 (wide character) string to a new character string.

docs.microsoft.com

 

3. 결과

 

 

 

 

COMMENT