LoginSignup
0
4

More than 5 years have passed since last update.

iconvの使い方

Last updated at Posted at 2018-08-30

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;
}
0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4