안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2013년 2월 15일 금요일

[펌] UTF-8 인코딩 및 여러 가지 인코딩 방법

문자열을 인코딩 하는 방법은 여러가지가 있습니다..
가장 널리 알려진 방법으로는

유니코드 -> 멀티바이트
1
2
3
4
5
wchar_t strUnicode[256] = {0,};
char    strMultibyte[256] = {0,};
wcscpy_s(strUnicode,256,L"유니코드");
int len = WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, NULL, 0, NULL, NULL );    
WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, strMultibyte, len, NULL, NULL );
stl이용
1
2
3
4
wstring strUni = L"유니코드";
int len = WideCharToMultiByte( CP_ACP, 0, &strUni[0], -1, NULL, 0, NULL, NULL );
string strMulti(len,0);
WideCharToMultiByte( CP_ACP, 0,  &strUni[0], -1, &strMulti[0], len, NULL, NULL );

멀티바이트 -> 유니코드
1
2
3
4
5
wchar_t strUnicode[256] = {0,};
char    strMultibyte[256] = {0,};
strcpy_s(strMultibyte,256,"멀티바이트");
int nLen = MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), strUnicode, nLen);
stl이용
1
2
3
4
string strMulti = "멀티바이트";  
int nLen = MultiByteToWideChar(CP_ACP, 0, &strMulti[0], strMulti.size(), NULL, NULL);
wstring strUni(nLen,0);
MultiByteToWideChar(CP_ACP, 0, &strMulti[0], strMulti.size(), &strUni[0], nLen);

유니코드 -> UTF-8
1
2
3
4
wchar_t strUni[256] =L"유니코드";
char strUtf8[256] ={0,};
int nLen = WideCharToMultiByte(CP_UTF8, 0, strUni, lstrlenW(strUni), NULL, 0, NULL, NULL);
WideCharToMultiByte (CP_UTF8, 0, strUni, lstrlenW(strUni), strUtf8, nLen, NULL, NULL);

UTF-8 -> 유니코드로 변환
1
2
3
4
5
    wchar_t strUnicode[256] = {0,};
char    strUTF8[256] = {0,};
strcpy_s(strUTF8,256,"utf-8글자..");// 이건 사실 멀티바이트지만 UTF8이라고 생각해주세요 -_-;;
int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, strlen(strUTF8), NULL, NULL);
MultiByteToWideChar(CP_UTF8, 0, strUTF8, strlen(strUTF8), strUnicode, nLen);

기본적으로 UTF-8로 변형할땐 유니코드 상태에서만 변형을 시켜야 된다!.
 만약 멀티 바이트를 UTF-8로 변형하고 싶을때에는
   멀티바이트 -> 유니코드(UTF-16) -> UTF-8
UTF-8을 멀티바이트로 변형할때에는
   UTF-8 -> 유니코드(UTF-16) -> 멀티바이트..
 


그런데 위와 같은 방식은.. 윈도우 환경에서만 사용한다면 너무 복잡하다...

우리 위대하신 MS에서 만들어주신게 있는데..
1
2
3
4
5
6
7
8
9
10
11
12
#include <atlstr.h> // 요기에 정의..  이거하면 MFC사용안하고도 CString를 사용할수 있다
void main()
{
  wstring strUni = CA2W("멀티바이트를 유니코드로 변환");
  string strMulti = CW2A(L"유니코드를 멀티바이트로 변환");
  string strUTF8 = CW2A(L"유니코드를 UTF8로변환",CP_UTF8);
  //string에서 포인터 얻어오는게 c_str()이듯.
  //CA2W나 CW2A에서 포인터 얻어오는건 m_psz 이다..
  //그리고 CA2W CW2A는 기본적으로 CString 즉 (CAtlString)에 기반을 두고 고 있기때문에.
  //CString를 사용할때 가장 빠른다!!.
  // 만약 멀티 플레폼을 기준으로 한다면 CA2W는 사용 못함!
}

사용하기도 쉽고 속도면에서 MultiByteToWideChar,WideCharToMultiByte 보다 빠르다...

이카르트님 감사합니다.

출처 : http://icartsh.tistory.com/13

2013년 2월 13일 수요일

Json Example (Json 포멧)

JSON (JavaScript Object Notation)

JSON is an extremely light text-based open standard designed for human-readable data. It originates from the JavaScript language and is used representing simple data types, arrays and associative arrays (called objects).

JSON Example

ArrayArray elements are generally of a basic type (number, string, boolean, or null), however can also be a nested array or object (see Data Structures). Elements are comma-delimited and contained within brackets.
myArray = [ "John Doe", 29, true, null ]
myArray = [ [], {} ]
myArray[2] returns true

Array with objectsThis array contains comma-delimited objects which each contain multiple comma-delimited key:value pairs. Objects within an array can be accessed using the array name and index.
myArray = [
 { "name": "John Doe", "age": 29 }, 
 { "name": "Anna Smith", "age": 24 }, 
 { "name": "Peter Jones", "age": 39 }
]
myArray[0].name returns John Doe

ObjectThis object contains multiple comma-delimited key:value pairs. Object properties can be accessed using the the object name followed by a period and property name -or- can be accessed like an array using the property name in quotes (in place of an index).
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true
}
myObject.salary returns 70000
myObject["salary"] returns 70000

Object with nested arrayThis object contains multiple comma-delimited key:value pairs and a nested array. The nested array can be accessed with the object name, property or 'key' containing the array and an array index.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ]
}
myObject.interests[0] returns Reading
myObject["interests"][0] returns Reading

Object with nested objectThis object contains multiple comma-delimited key:value pairs and a nested object. To access an object within an object, property names or 'keys' can be chained together -or- property names can be used like an array in place of indexes.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 } 
}
myObject.favorites.food returns Spaghetti
myObject["favorites"]["food"] returns Spaghetti

Object with nested arrays and objectsThis object is more complex and typical of what might come from an API. It contains key:value pairs, nested arrays and nested objects. Any of its elements can be accessed with a combination of the above techniques.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ],
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 }, 
 "skills": [
  {
   "category": "Javascript",
   "tests": [
    { "name": "One", "score": 90 },
    { "name": "Two", "score": 96 }
   ] 
  },
  {
   "category": "CouchDB",
   "tests": [
    { "name": "One", "score": 79 },
    { "name": "Two", "score": 84 }
   ] 
  },
  {
   "category": "Node.js",
   "tests": [
    { "name": "One", "score": 97 },
    { "name": "Two", "score": 93 }
   ] 
  }
 ]
}
myObject.skills[0].category returns Javascript
myObject["skills"][0]["category"] returns Javascript
myObject.skills[1].tests[0].score returns 79
myObject["skills"][1]["tests"][0]["score"] returns 79

Data Structures

Numbervar myNum = 123.456Double precision floating-point format in JavaScript; generally depends on implementation.
Stringvar myString = "abcdef"Series of characters (letters, numbers, or symbols); double-quoted UTF-8 with backslash escaping.
Booleanvar myBool = true(true or false)
Arrayvar myArray = [ "a", "b", "c", "d" ]Sequence of values, comma-separated and enclosed in square brackets; values don't need to be of the same type.
Objectvar myObject = { "id": 007 }Unordered collection of key:value pairs; comma-separated and enclosed in curly braces; the should be strings and be distinct.
Nullvar myNull = null(empty)

JSON Resources

JSONLintJSON validator


출처 :http://www.jsonexample.com/

Array

myArray = [ "John Doe", 29, true, null ]
myArray[2] returns true 

Array 형식은 myArray[0] ,myArray[1] 처럼 평소 사용하던 Array 사용 방법으로 사용할 수 있다.
0은 John Doe, 1 은 29를 반환한다.

Array with objects

myArray = [
 { "name": "John Doe", "age": 29 }, 
 { "name": "Anna Smith", "age": 24 }, 
 { "name": "Peter Jones", "age": 39 }
]
Array에 Object를 넣는 방법이다.

myArray[0].name returns John Doe
myArray[1].age 는 24를 return 하게 된다.

Object

object는 ":" 값을 기준으로 Key 값과 실제 값으로 매칭된다.
myObject = { "first": "John", "last": "Doe", "age": 39, "sex": "M", "salary": 70000, "registered": true }
myObject.salary returns 70000 myObject["salary"] returns 70000
위 두가지 방법으로 각각의 object를 추출 할 수 있다.
myobject.first 는 John을 반환하고,
myObject["first"] 로도 John을 반환할 수 있다.

Object with nested array

iterests 를 보면, interest 키 값에 Array가 대응될 수 있음을 알 수 있다.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ]
}
myObject.interests[0] returns Reading
myObject["interests"][0] returns Reading 
 
Object with nested arrays and objects

myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ],
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 }, 
 "skills": [
  {
   "category": "Javascript",
   "tests": [
    { "name": "One", "score": 90 },
    { "name": "Two", "score": 96 }
   ] 
  },
  {
   "category": "CouchDB",
   "tests": [
    { "name": "One", "score": 79 },
    { "name": "Two", "score": 84 }
   ] 
  },
  {
   "category": "Node.js",
   "tests": [
    { "name": "One", "score": 97 },
    { "name": "Two", "score": 93 }
   ] 
  }
 ]
}
myObject.skills[0].category returns Javascript
myObject["skills"][0]["category"] returns Javascript
myObject.skills[1].tests[0].score returns 79
myObject["skills"][1]["tests"][0]["score"] returns 79

위와 같이 복잡한 관계도 만들어 낼 수 있다.

기본 개념은 Array와 Object를 이용하여, Data를 Object Oriented 하게 만들어 내는 것인 듯 하다.

2013년 2월 7일 목요일

UTF-8 에서 한글 깨짐 문제 처리

UTF-8 에서 한글이 깨져서 나오는 문제를
Ansi(EUC-KR)로 바꿔서 처리하는 코드입니다.

#include <WTypes.h >
#include <oleauto.h>

위 두 헤더 파일을 include 하고,

char* UTF8ToANSI(char *pszCode)
{
    BSTR    bstrWide;
    char*   pszAnsi;
    int     nLength;
    // Get nLength of the Wide Char buffer
    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_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
    pszAnsi = new char[nLength];
    // Change from unicode to mult byte
    WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
    SysFreeString(bstrWide);
    return pszAnsi;
}

해당 코드를 추가 하면 됩니다.

이틀을 찾아 해메던, 한글 깨짐 문제를 드디어 해결하였습니다.

사랑합니다. 이광진님

출처: http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=657497&ref=657497

2013년 2월 6일 수요일

[LibCurl] 로그인 예제

/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* Include libraries */
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
size_t func( void* ptr, size_t size, size_t nmemb, void* stream);
int main(void)
{
  CURL *curl;
  CURLcode res;
  char* header;
  char* body;
  header = (char*)calloc(100000, sizeof(char));
  body = (char*)calloc(100000, sizeof(char));
  curl = curl_easy_init(); // Initialization 코드
  if(curl) {
// ID PWD 항목에 해당 ID와 PWD를 넣으면 알아서, ID PWD를 넣어준다.   
// curl_easy_setopt(curl, CURLOPT_USERPWD, " ID : PWD");
// URL 을 사용하는 코드 example.com에 해당 URL 을 넣으면 URL 을 저장한다.
    curl_easy_setopt(curl, CURLOPT_URL, www.example.com);
// FOLLOWLOCATION을 1로 보내면, Redirection 을 모두 따라 간다.
 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); // Allow redirection
// 아래 두 줄은 Post 메세지에 메세지를 실어 보내기 위한 방법이다.
// curl_easy_setopt(curl, CURLOPT_POST, 1);
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "ID : PWD");

//WriteFunction 에 Function 등록하면 Callback으로 메세지를 받게 된다.
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, func);
//WriteHeader 옵션으로 헤더 받음
    curl_easy_setopt(curl, CURLOPT_WRITEHEADER, header);
//WriteData 옵션으로 데이터 받음. WriteFunction의 Callback 메세지를 Header와 Body로
//나누어 받은 것
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, body);
// 위에 입력한 옵션들을 실행하는 함수
    res = curl_easy_perform(curl);
    /* always cleanup */
//함수 실행 후 종료 (메모리삭제)
    curl_easy_cleanup(curl);
  }
  printf("\n\nHEADER is\n%s\n\n\n", header);
  printf("\n\nBODY is\n%s\n\n\n", body);
  free(header);
  free(body);
  return 0;
}
size_t func( void* ptr, size_t size, size_t nmemb, void* stream)
{
        strncat( (char*)stream, (char*)ptr, size*nmemb);
        return size*nmemb;
}