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/ |
반응형
댓글