2014년 10월 29일 수요일

[MFC] 한글 ASCII UTF8 코드 변환

[Tip] 한글 ASCII 코드를 웹 URL에서 사용되는 UTF8 코드로 변환
 
팁스소프트에서 제공하는 프로그래밍과 관련된 자료나 정보들을 무단으로 복제하거나 게재하는 행위는
상호간의 신뢰를 무너뜨리는 행위이며, 법적인 문제를 야기할 수 있으므로 각별한 주의를 당부드립니다.
* 팁스소프트 저작권 정책 보기 -  http://www.tipssoft.com/bulletin/tb.php/FAQ/637
 
이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 -  http://www.tipssoft.com/bulletin/tb.php/QnA/8406
 
 
 
안녕하세요~!
 
한글 ASCII 형식의 문자열을 웹 URL에서 사용되는 멀티바이트 코드인 UTF8 형식의 문자열로 변환하는
방법에 대해서 설명하겠습니다.
 
웹에서는 ASCII 형식의 문자열이 사용되지 않고 UTF8 형식의 문자열이 사용됩니다. 특히 URL에서 한글이
적용되는 형태는 UTF8 형식에서 한단계 더 변형된 형태가 사용됩니다. 예를 들어 검색사이트 에서 "한글"
이라는 단어를 검색하게 되면 적용되는 URL에서 "한글" 이라는 단어는 "%ED%95%9C%EA%B8%80"
과 같은 형태로 변형 되어 사용됩니다.
 
일반 프로그래밍시 사용되는 문자열의 형태는 ASCII 코드이기 때문에 웹과 관련된 프로그래밍을 위해서는
ASCII 코드 형태의 문자열을 UTF8 형태로 변형해야 하고 URL에 적용되는 한글의 경우 위와 같이 한단계
더 변형된 형태로 프로그래밍이 이루어 져야 합니다.
 
한글 ASCII 코드를 UTF8 코드로 변환하기 위해서 ASCII 코드를 UTF8 코드로 바로 변환할 수 있는 함수가
없기 때문에 먼저 ASCII 코드를 유니코드로 변환하고 변환된 유니코드를 UTF8 코드로 변환해야 합니다.
 
 
          "ASCII 코드" -> "유니코드" -> "UTF8 코드"
 
 
ASCII 코드를 유니코드로 변환하기 위해서는 MultiByteToWideChar 함수를 사용하고 유니코드를
ASCII 코드로 변환하는것은 특별한 함수를 사용하지 않아도 CString 클래스가 변환해 주기 때문에
CString 클래스를 사용하면 됩니다.
 
그리고 변환된 한글 UTF8 코드를 URL에서 적용되는 형태로 변형합니다. 단, 영어의 경우 한글과 같이
UTF8 코드에서 한단계 더 변형된 형태로 사용되지 않습니다. 영어는 UTF8 코드 형태 그대로 사용되고
한글일 경우에만 위와 같이 변형 되어 사용됩니다.
 
 
// UTF8 코드로 변환하고자 하는 CString 타입의 parm_ascii_string, UTF8 코드로 변환된
// 값을 넣어줄 CString 타입의 parm_utf8_string 2개의 함수 인자를 사용한다.
void AsciiToUTF8(CString parm_ascii_string, CString &parm_utf8_string)
{
     parm_utf8_string.Empty();

     // 아스키 코드를 UTF8형식의 코드로 변환해야 한다. 아스키 코드를 UTF8 코드로 변환할때는
     // 아스키 코드를 유니코드로 먼저 변환하고 변환된 유니코드를 UTF8 코드로 변환해야 한다.

     // 아스키 코드로된 문자열을 유니코드화 시켰을 때의 길이를 구한다.
      int temp_length = MultiByteToWideChar(CP_ACP, 0, (char *)(const char *)parm_ascii_string, -1, NULL, 0);
     // 변환된 유니코드를 저장할 공간을 할당한다.     BSTR unicode_str = SysAllocStringLen(NULL, temp_length + 1);

     // 아스키 코드로된 문자열을 유니 코드 형식의 문자열로 변경한다.      MultiByteToWideChar(CP_ACP, 0, (char *)(const char *)parm_ascii_string, -1, unicode_str, temp_length);

     // 유니코드 형식의 문자열을 UTF8 형식으로 변경했을때 필요한 메모리 공간의 크기를 얻는다.     temp_length = WideCharToMultiByte( CP_UTF8, 0, unicode_str, -1, NULL, 0, NULL, NULL );

     if(temp_length > 0){
        CString str;
        // UTF8 코드를 저장할 메모리 공간을 할당한다.        char *p_utf8_string = new char[temp_length];
        memset(p_utf8_string, 0, temp_length);
        // 유니코드를 UTF8코드로 변환한다.        WideCharToMultiByte(CP_UTF8, 0, unicode_str, -1, p_utf8_string, temp_length, NULL, NULL);
 
        // UTF8 형식으로 변경된 문자열을 각 문자의 코드값별로 웹 URL에 사용되는 형식으로 변환한다.        for(int i = 0; i < temp_length - 1; i++){
            if(p_utf8_string[i] & 0x80){
                // 현재 코드가 한글인 경우..
                // UTF8 코드로 표현된 한글은 3바이트로 표시된다. "한글"  ->  %ED%95%9C%EA%B8%80
                for(int sub_i = 0; sub_i < 3; sub_i++){
                    str.Format("%%%X", p_utf8_string[i] & 0x00FF);
                    parm_utf8_string += str;
                    i++;
                }
   
                i--;
            } else {
                // 현재 코드가 영문인 경우, 변경없이 그대로 사용한다.
               parm_utf8_string += p_utf8_string[i];
            }
        }                                                             
 
        delete[] p_utf8_string;
     }

      // 유니코드 형식의 문자열을 저장하기 위해 생성했던 메모리를 삭제한다.
      SysFreeString(unicode_str);
}


출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=749

댓글 없음:

댓글 쓰기