D Language 인코딩 변환하기 위해.

토요일부터 D Language의 인코딩 변화를 위해서 무엇을 쓸까 고민하다가, 결국 iconv모듈로 가게 되었다. 실제적으로 기본 라이브러리인 phobos에서 인코딩 변환을 utf 인코딩간만 지원하기 때문에 나처럼 한글 형태소 분석기를 utf-8기반으로 돌려야 하는 사람에게는 인코딩 변환이 필수이다.

그런데, iconv모듈을 엊을라면 뭘 어떻게 해야할까? 언어 자체적으로 지원하는 다이내믹 라이브러리 로딩 방법을 써서 함수 포인터를 연결해 주면 될것이다.

뭐 몇시간 찾다가 아는 사람들만 아는 모듈을 찾아서 실험해 보았다. 이거 실험하는데 정말 D Language에서 포인터가 어떻게 작동이 되는지 C 방식의 함수와 인터페이싱 하면서 많이 배운거 같다.

D Language에서 구현한 iconv 모듈이다.

XbvWh4W4cB.d
그리고 그것을 테스트 할수 있는 함수는 아래와 같다.

[CODE c]
char[] changeEncoding(char[] from, char[] to,in char[] strSrc){
    from ~= “\0”;
    to ~= “\0”;

    strSrc ~= “\0”;
    void* inp = cast(char*)strSrc;

    size_t input = strSrc.length;
    char[] strDest = new char[input * 2];
    void* outp = cast(char*)strDest;
    size_t output = strDest.length;

    iconv_t convt = iconv_open(cast(char*)to, cast(char*)from);
    iconv(convt,  &inp, &input, &outp, &output);
    iconv_close(convt);

    return strDest;
}

[/CODE]

D 언어에서는 문자열의 끝이 “\0″이 아니기 때문에 저렇게 concate해서 C 스타일의 문자열로 만들어 줘야 한다. 그리고 char 포인터와 배열은 약간 다른 성격의 것으로 인식하기 때문에 저런 캐스팅작업이 필요하다.

CC BY-NC 4.0 D Language 인코딩 변환하기 위해. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.