none
MFC 프로젝트 중 UTF-8로 인코딩되어 있는 문자가 unicode로 변환이 되지 않습니다. RRS feed

  • 질문

  • 안드로이드 <-> 윈도우(MFC)간 채팅 프로그램 을 만들고 있습니다만, 한글이 깨지는 문제점이 해결이 안되고 있습니다.

    현상:

    stomp socket 을 통하여 UTF-8형식의

    예) "가" 라는 std::string type의 문자열을 전달 받아 unicode로 변환을 하여도 값이 변경되지 않습니다(한글깨짐).

    "%EA%B0%80"(UTF-8)  변환 후 ->"%EA%B0%80"   << 원하는 값 "FF FE 00 AC"(unicode)

    (%가 붙은것은 서버에서 문자열이 들어올 때 urlEncoding된 데이타 이기 때문입니다.)

    코딩은 이하와 같이 WideCharToMultiByte(CP_UTF8, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL) 를 이용하였습니다만, pszAnsi값에 변경이 없네요.

    이하는 UTF-8->unicode에 이용한 변환함수입니다.

    char* StompClient::UTF8toANSI(char *pszCode) 

        BSTR    bstrWide; 
        char*   pszAnsi; 
        int     nLength;     

        nLength = MultiByteToWideChar(CP_UTF8, 0, pszCode, lstrlen(pszCode) + 1,NULL, NULL); 
        bstrWide = SysAllocStringLen(NULL, nLength); 
     
        // Change UTF-8 to Unicode (UTF-16) 
        MultiByteToWideChar(CP_UTF8, 0, pszCode, lstrlen(pszCode) + 1, bstrWide,nLength);  
      

        // Get nLength of the multi byte buffer   
        nLength = WideCharToMultiByte(CP_UTF8, 0, bstrWide, -1, NULL, 0, NULL, NULL);  
     
        pszAnsi = new char[nLength]; 

        memset(pszAnsi, 0, nLength);

        // Change from unicode to mult byte  
        WideCharToMultiByte(CP_UTF8, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL); 
        SysFreeString(bstrWide);  
        return pszAnsi; 

    PS. 기술답변 601368 에 있는 내용을 참고로 WideCharToMultiByte대신에 WideStrToUTF8Str()을 사용해 보아도 결과는 마찬가지였습니다.ㅠㅠ

    기본적인 한글 처리가 안되다 보니 다음이 전혀 진행되지를 않네요..ㅠㅠ

    도움 부탁드립니다.


    • 편집됨 김만근 2013년 1월 9일 수요일 오전 7:50
    2013년 1월 9일 수요일 오전 7:29

답변

  • 제 답변을 잘 안 읽으셨군요. WideCharToMultiByte 함수 사용에 보면 인자로 CP_UTF8 이 들어가 있는데요. 그걸 CP_ACP로 바꿔야 합니다.

    2013년 1월 10일 목요일 오전 6:31
  • 저희도 안드로이드랑 통신하는 어플 종종 만드는데 UTF16 은 고려하지 않아도 되지 않나요?
    UTF8 처리만 하시면 될듯한데, 저희는 아래에 링크해드린 자료에 있는 함수 이용해서 그냥
    변환해서 사용하는데 잘 사용하고 있습니다.

    http://www.tipssoft.com/bulletin/tb.php/FAQ/503
     
    이클립스 에디터가 UTF16 을 사용한다고하더라도 앱자체는 UTF8을 사용할텐데, 설정을 특별하게
    변경해서 사용하고 계신건가요?

    2013년 1월 16일 수요일 오전 8:46
    중재자

모든 응답

  • UTF8을 Unicode로 변경한 다음, 다시 Ansi 로 변경하고 있는데요.

    그렇다면 두번째 WideCharToMultiByte 2개의 호출에서 CP_UTF8 이 아닌 CP_ACP를 호출해야 맞지 않을까요? ^^
    2013년 1월 10일 목요일 오전 1:42
  • MultiByteToWideChar()를 사용해 보아도 값은 여전히 UTF8값으로 unicode값으로 변경되지 않았습니다.ㅠㅠ
    2013년 1월 10일 목요일 오전 6:20
  • 제 답변을 잘 안 읽으셨군요. WideCharToMultiByte 함수 사용에 보면 인자로 CP_UTF8 이 들어가 있는데요. 그걸 CP_ACP로 바꿔야 합니다.

    2013년 1월 10일 목요일 오전 6:31
  • 저희도 안드로이드랑 통신하는 어플 종종 만드는데 UTF16 은 고려하지 않아도 되지 않나요?
    UTF8 처리만 하시면 될듯한데, 저희는 아래에 링크해드린 자료에 있는 함수 이용해서 그냥
    변환해서 사용하는데 잘 사용하고 있습니다.

    http://www.tipssoft.com/bulletin/tb.php/FAQ/503
     
    이클립스 에디터가 UTF16 을 사용한다고하더라도 앱자체는 UTF8을 사용할텐데, 설정을 특별하게
    변경해서 사용하고 계신건가요?

    2013년 1월 16일 수요일 오전 8:46
    중재자