본문 바로가기

지식/VC++

char 문자열을 utf8로 변환하기

C로 구현하려니 완전 삽질이 된듯하다.
어디서 소스를 하나 주워왔다.
물론 안에서는 구현되있기는 하지만 나는 utf8형식으로 URL을 날려줘야하기때문에 utf8형식의 텍스트 데이터가 필요해서 약간 수정해봤다.

위에 소스중에
아래 부분이 내가 수정한 부분이다.
static char *make_utf8_string(const wchar_t *unicode)
{
    int out_size = 0,size = 0, index = 0, out_index = 0;
    unsigned char *out;
 char *out_txt;
   
 unsigned short c;
 char buf[512];

    /* first calculate the size of the target string */
    c = unicode[index++];
    while(c) {
        if(c < 0x0080) {
            size += 1;
   out_size += 3;
        } else if(c < 0x0800) {
            size += 2;
   out_size += 6;
        } else {
            size += 3;
   out_size += 9;
        }
        c = unicode[index++];
    }  

    out = (unsigned char*)malloc(size + 1);
    if (out == NULL)
        return NULL;
 
 out_txt = (char*)malloc(out_size +1);
 memset(out_txt,0,out_size+1);

    index = 0;

    c = unicode[index++];
    while(c)
    {
        if(c < 0x080) {
            out[out_index++] = (unsigned char)c;
   if(c== ' ') // 스페이스 바
    sprintf(buf,"%%%X",(unsigned char)c);
   else if(c == '%')
    sprintf(buf,"%%%c%c",unicode[index++],unicode[index++]);
   else
    sprintf(buf,"%c",(unsigned char)c);
   strcat(out_txt,buf);

        } else if(c < 0x800) {
            out[out_index++] = 0xc0 | (c >> 6);
            out[out_index++] = 0x80 | (c & 0x3f);
   
   
   sprintf(buf,"%%%X", (unsigned char)0xc0 | (c >> 6) );
   strcat(out_txt,buf);
   sprintf(buf,"%%%X", (unsigned char)0x80 | (c & 0x3f) );
   strcat(out_txt,buf);
   
        } else {
            out[out_index++] = 0xe0 | (c >> 12);
            out[out_index++] = 0x80 | ((c >> 6) & 0x3f);
            out[out_index++] = 0x80 | (c & 0x3f);
   
   sprintf(buf,"%%%X", (unsigned char)0xe0 | (c >> 12));
   strcat(out_txt,buf);
   sprintf(buf,"%%%X", (unsigned char)0x80 |((c >> 6) & 0x3f));
   strcat(out_txt,buf);
   sprintf(buf,"%%%X", (unsigned char)0x80 | (c & 0x3f));
   strcat(out_txt,buf);
   
        }
        c = unicode[index++];
    }
    out[out_index] = 0x00;
 free(out); // 값만 저장한 배열..현재는 txt형태로 출력되므로 일단 지워준다..
    //free(out_txt);
 return out_txt;
}