C言語にて、libiconv を使って ISO-2022-JP から UTF-8 に変換する

libiconv

libiconv は、文字列の文字コードを変換するC言語のライブラリです。

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

MAC では brew コマンドでインストールできる。
https://formulae.brew.sh/formula/libiconv

ISO-2022-JP

日本語メールで使用されている文字コードです。 RFC1468 にて標準規格になっている。 エスケープシーケンスより英文字(ASCII文字)と日本語を切り替える。

日本語 : ESC(0x1B) , 0x24 , 0x42
英文字 : ESC(0x1B) , 0x28 , 0x42

日本語の後に、改行コード(0x0A) を付加する場合にも、 英文字のエスケープシーケンスが必要です。

RFC1468
Japanese Character Encoding for Internet Messages
http://www.t-net.ne.jp/~cyfis/rfc/char/rfc1468_ja.html

文字コード表 JISコード(ISO-2022-JP)
http://charset.7jp.net/jis.html

### ISO-2022-JP から UTF-8 に変換する。

下記を参考にした。

iconv の使い方
https://qiita.com/office-itou/items/6271bcc1a05682133f1a

iconv で変換できる文字コードは、下記のコマンドで表示できる。

% iconv -l

const size_t CONV_BUFSIZE = 1024;

void iso2022jp_to_utf8(const char *src,  size_t src_size, char *dst, size_t dst_size)
{

    const char TOCODE[] = "UTF-8//IGNORE";
    const char FROMCODE[] = "ISO-2022-JP";

    conv_charset( src,  src_size, dst, dst_size, 
    (char *)TOCODE, (char *)FROMCODE );

}

void conv_charset(const char *src,  size_t src_size, char *dst, size_t dst_size, const char *tocode, const char *fromcode)
{

    char buf[CONV_BUFSIZE];

    if(src_size > CONV_BUFSIZE){
        printf( "src text size is too large");
        return;
    }

    char *src_buf = buf;
    char *dst_buf = dst;
    size_t src_len = src_size;
    size_t dst_len = dst_size - 1;
    int save_err;

    strncpy(buf, src, src_size);

    iconv_t conv = iconv_open( (char *)tocode, 
    (char *)fromcode );

    if ( conv  == (iconv_t) - 1) {
// iconv が対応していない文字コードを指定すると、このエラーになる。
        save_err = errno;
        printf(  "iconv_open: %s \n", strerror(save_err) );
        return;
    }

    size_t ret = iconv(conv, &src_buf, &src_len, &dst_buf, &dst_len);
    if ( ret == (size_t) - 1) {
        save_err = errno;
        printf(  "iconv: %s \n", strerror(save_err) );
        return ;
    }

    *dst_buf = '\0';

    iconv_close(conv);

}

Github にコードを公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/libiconv