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