iconv编码转换问题

use*_*920 0 c c++ iconv

我在将字符串从 utf8 转换为 gb2312 时遇到问题。我的转换功能如下

void convert(const char *from_charset,const char *to_charset, char *inptr, char *outptr)
{
    size_t inleft = strlen(inptr);
    size_t outleft = inleft;
    iconv_t cd;     /* conversion descriptor */

    if ((cd = iconv_open(to_charset, from_charset)) == (iconv_t)(-1)) 
    {
            fprintf(stderr, "Cannot open converter from %s to %s\n", from_charset, to_charset);
            exit(8);
    }

    /* return code of iconv() */
    int rc = iconv(cd, &inptr, &inleft, &outptr, &outleft);
    if (rc == -1) 
    {
            fprintf(stderr, "Error in converting characters\n");

            if(errno == E2BIG)
                    printf("errno == E2BIG\n");
            if(errno == EILSEQ)
                    printf("errno == EILSEQ\n");
            if(errno == EINVAL)
                    printf("errno == EINVAL\n");

            iconv_close(cd);
            exit(8);
    }
    iconv_close(cd);
}
Run Code Online (Sandbox Code Playgroud)

这是我如何使用它的示例:

int len = 1000;
char *result = new char[len];
convert("UTF-8", "GB2312", some_string, result);
Run Code Online (Sandbox Code Playgroud)

编辑:我大部分时间都会遇到 E2BIG 错误。

Tro*_*nic 5

outleft 应该是输出缓冲区的大小(例如 1000 字节),而不是传入字符串的大小。

转换时,字符串长度通常会在此过程中发生变化,您无法知道它会持续多长时间。E2BIG 意味着输出缓冲区不够大,在这种情况下,您需要给它更多的输出缓冲区空间(注意它已经转换了一些数据并相应地调整了传递给它的四个变量)。