프로그래밍/C, C++

C, C++ 문자열 인코딩(iconv)

꾸션 2016. 12. 23. 13:29

iconv 라이브러리를 활용하여 문자열 인코딩 하는 방법입니다.

iconv 라이브러리 홈페이지는 "https://www.gnu.org"입니다.

(다운로드: https://www.gnu.org/software/libiconv/#downloading)

 

최신 리눅스의 경우는 기본 설치가 되어 있으며, 설치가 안 되어 있는 경우는 apt-get, rpm 혹은 소스 설치하시면 됩니다.

OS가 윈도우인 경우는 라이브러리 파일(*.tar.gz)안에 README.windows에 명시되어 있는대로 빌드하여 사용하시면 됩니다.

 

함수 설명

주요함수: 
iconv_t iconv_open(
const char* tocode,
const char* fromcode);
설명: 현재 문자셋, 변경할 문자셋을 지정하고 Conversion Descriptor를 얻어온다.
 
파라미터:
tocode: 변경 문자셋 (인코딩 목록 참조)
fromcode: 현재 문자셋 (인코딩 목록 참조)
 
리턴 값: Conversion Descriptor(변수 타입: iconv_t)
 
 
size_t iconv(
iconv_t cd, 
const char* * inbuf, size_t * inbytesleft, 
char* * outbuf, size_t * outbytesleft);
설명: 문자열의 문자셋을 변경한다.
 
파라미터:
cd: Conversion Descriptor
inbuf: 변경할 문자열
inbytesleft: 변경할 문자열 길이 포인터
outbuf: 변경된 문자열
outbytesleft: 변경된 문자열 길이 포인터
 
리턴 값: 변경된 문자열 길이 (에러인 경우: (incov_t)(-1))
 
 
int iconv_close(iconv_t cd);
설명: Conversion Descriptor를 닫는다.
 
파라미터:
cd: conversion Descriptor
 
리턴 값: 성공인 경우는 0, 에러인 경우는 -1
 

함수 사용법

#include <iconv.h>

bool ChangeCharset(char *szSrcCharset, char *szDstCharset, char *szSrc, int nSrcLength, char *szDst, int nDstLength)
{
  iconv_t it = iconv_open(szDstCharset, szSrcCharset);
  if (it == (iconv_t)(-1))
    return false;
    
  bool result = true;
  size_t nSrcStrLen = nSrcLength;
  size_t nDstStrLen = nDstLength;
  size_t cc = iconv(it, &szSrc, &nSrcStrLen, &szDst, &nDstStrLen);
  
  if (cc == (size_t)(-1))
    result = false;

  if (iconv_close(it) == -1)
    result = false;

  return result;
}

 

char szSrc[] = "대한민국";
char szDst[100];
ChangeCharset("utf-8", "euc-kr", szSrc, strlen(szSrc), szDst, sizeof(szDst)); // utf-8에서 euc-kr로 변경

 

인코딩 목록

European languages
ASCII, ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16}, KOI8-R, KOI8-U, KOI8-RU, CP{1250,1251,1252,1253,1254,1257}, CP{850,866,1131}, Mac{Roman,CentralEurope,Iceland,Croatian,Romania}, Mac{Cyrillic,Ukraine,Greek,Turkish}, Macintosh
Semitic languages
ISO-8859-{6,8}, CP{1255,1256}, CP862, Mac{Hebrew,Arabic}
Japanese
EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1
Chinese
EUC-CN, HZ, GBK, CP936, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, BIG5-HKSCS:2004, BIG5-HKSCS:2001, BIG5-HKSCS:1999, ISO-2022-CN, ISO-2022-CN-EXT
Korean
EUC-KR, CP949, ISO-2022-KR, JOHAB
Armenian
ARMSCII-8
Georgian
Georgian-Academy, Georgian-PS
Tajik
KOI8-T
Kazakh
PT154, RK1048
Thai
ISO-8859-11, TIS-620, CP874, MacThai
Laotian
MuleLao-1, CP1133
Vietnamese
VISCII, TCVN, CP1258
Platform specifics
HP-ROMAN8, NEXTSTEP
Full Unicode
UTF-8 
UCS-2, UCS-2BE, UCS-2LE 
UCS-4, UCS-4BE, UCS-4LE 
UTF-16, UTF-16BE, UTF-16LE 
UTF-32, UTF-32BE, UTF-32LE 
UTF-7 
C99, JAVA
Full Unicode, in terms of uint16_t or uint32_t (with machine dependent endianness and alignment)
UCS-2-INTERNAL, UCS-4-INTERNAL
Locale dependent, in terms of `char' or `wchar_t' (with machine dependent endianness and alignment, and with OS and locale dependent semantics)
char, wchar_t 
The empty encoding name "" is equivalent to "char": it denotes the locale dependent character encoding.
When configured with the option --enable-extra-encodings, it also provides support for a few extra encodings:
European languages
CP{437,737,775,852,853,855,857,858,860,861,863,865,869,1125}
Semitic languages
CP864
Japanese
EUC-JISX0213, Shift_JISX0213, ISO-2022-JP-3
Chinese
BIG5-2003 (experimental)
Turkmen
TDS565
Platform specifics
ATARIST, RISCOS-LATIN1

출처: https://www.gnu.org/software/libiconv/