본문 바로가기
개발 업무(코딩)-개발자였을때 썼던..

curl 한글깨짐현상 + MemoryStruct(feat. koscom api)

by 주용사 2023. 1. 8.
728x90

코스콤 koscom api 를 사용하여 주식데이터를 내려받아 fwrite를 했더니 한글이 깨졌다. 이것을 해결하기 위해서 memorystruct을 도입했다.

(사실 locale.h로 시도하다가 삽질)

/usr/share/doc/libcurl-devel-7.29.0/getinmemory.c

에 있는 샘플코드를 이용하였고 추가한부분은 url과 FILE 관련 부분이다.

 
#include "changjo.h"

struct MemoryStruct {
        char *memory;
        size_t size;
};

static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
        size_t realsize = size * nmemb;
        struct MemoryStruct *mem = (struct MemoryStruct *)userp;

        mem->memory = realloc(mem->memory, mem->size + realsize + 1);
        if (mem->memory == NULL) {
                /* out of memory! */
                printf("not enough memory (realloc returned NULL)\n");
                exit(EXIT_FAILURE);
        }

        memcpy(&(mem->memory[mem->size]), contents, realsize);
        mem->size += realsize;
        mem->memory[mem->size] = 0;

        return realsize;
}


int main(void)
{
        CURL *curl_handle;

        struct MemoryStruct chunk;

        chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */
        chunk.size = 0;    /* no data at this point */
        const char* url = "https://sandbox-apigw.koscom.co.kr/v2/market/stocks/kospi/lists?apikey=넣으시오" ;

        curl_global_init(CURL_GLOBAL_ALL);

        /* init the curl session */
        curl_handle = curl_easy_init();

        /* specify URL to get */
        curl_easy_setopt(curl_handle, CURLOPT_URL, url);

        /* send all data to this function  */
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);

        /* we pass our 'chunk' struct to the callback function */
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);

        /* some servers don't like requests that are made without a user-agent
         *      field, so we provide one */
        //curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");

        /* get it! */
        curl_easy_perform(curl_handle);

        FILE *fp = fopen("test.txt", "w");
        fwrite(chunk.memory, chunk.size, 1, fp);
        fclose (fp);

        /* cleanup curl stuff */
        curl_easy_cleanup(curl_handle);

        /*
         ** Now, our chunk.memory points to a memory block that is chunk.size
         ** bytes big and contains the remote file.
         **
         ** Do something nice with it!
         **
         ** You should be aware of the fact that at this point we might have an
         ** allocated data block, and nothing has yet deallocated that data. So when
         ** you're done with it, you should free() it as a nice application.
         **/

        printf("%lu bytes retrieved\n", (long)chunk.size);

        if(chunk.memory)
                free(chunk.memory);

        /* we're done with libcurl, so clean it up */
        curl_global_cleanup();

        return 0;
}
728x90