我在将字符串从 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 错误。
outleft 应该是输出缓冲区的大小(例如 1000 字节),而不是传入字符串的大小。
转换时,字符串长度通常会在此过程中发生变化,您无法知道它会持续多长时间。E2BIG 意味着输出缓冲区不够大,在这种情况下,您需要给它更多的输出缓冲区空间(注意它已经转换了一些数据并相应地调整了传递给它的四个变量)。