iconvの使い方です。
sjis->utf8のみに限定してありますが、パラメータを変えれば他言語変換もできると思います。
BUFF_MAXは想定される最大サイズを設定して下さい。
この関数内ではmallocやstrdup等は使用できません。(異常終了します)
・man: iconv_open, iconv, iconv_close
※2018/11/16:MS-SJISの場合はCP932でないと一部の文字が化けることが判明したので修正しました。
# include <iconv.h>
# include <errno.h> // errno
# include <stdio.h> // fprintf
# include <string.h> // strncpy,strlen
# define pr_err(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
int my_sjis2utf8(const char *src, char *dst, size_t len)
{
iconv_t conv; // conversion descriptor
char buf[BUFF_MAX];
char *src_buf = buf;
char *dst_buf = dst;
size_t src_len = strlen(src);
size_t dst_len = len - 1;
int ret = 0;
strncpy(buf, src, sizeof(buf));
if ((conv = iconv_open("UTF-8", "CP932")) == (iconv_t) - 1) {
pr_err("error: %s: %s\n", __FUNCTION__, "iconv open");
return -errno;
}
if (iconv(conv, &src_buf, &src_len, &dst_buf, &dst_len) == (size_t) - 1) {
pr_err("error: %s: %s\n", __FUNCTION__, "iconv");
ret = -errno;
}
*dst_buf = '\0';
if (iconv_close(conv) == -1) {
pr_err("error: %s: %s\n", __FUNCTION__, "iconv_close");
ret = -errno;
}
return ret;
}