gpt4 book ai didi

c++ - iconv 只工作一次

转载 作者:太空狗 更新时间:2023-10-29 21:06:10 29 4
gpt4 key购买 nike

我尝试制作使用 iconv 将 s-jis 字符串转换为 utf-8 字符串的方法。我在下面写了一段代码,

#include <iconv.h>
#include <iostream>
#include <stdio.h>
using namespace std;

#define BUF_SIZE 1024
size_t z = (size_t) BUF_SIZE-1;

bool sjis2utf8( char* text_sjis, char* text_utf8 )
{
iconv_t ic;
ic = iconv_open("UTF8", "SJIS"); // sjis->utf8
iconv(ic , &text_sjis, &z, &text_utf8, &z);
iconv_close(ic);
return true;
}
int main(void)
{
char hello[BUF_SIZE] = "hello";
char bye[BUF_SIZE] = "bye";
char tmp[BUF_SIZE] = "something else";

sjis2utf8(hello, tmp);
cout << tmp << endl;

sjis2utf8(bye, tmp);
cout << tmp << endl;
}

并且,输出应该是

hello
bye

但实际上,

hello
hello

有谁知道为什么会出现这种现象?我的程序有什么问题?

请注意,“hello”和“bye”在我的原始程序中是日语 s-jis 字符串,但我对其进行了更改以使程序易于查看。

最佳答案

我认为您通过将全局变量 z 传递给 iconv 函数而误用了它。第一次调用 sjis2utf8 时,z 递减为 0。第二次调用 sjis2utf8 无效 (z==0) 并离开tmp 不变。

来自 iconv documentation :

size_t iconv (iconv_t cd,
const char* * inbuf, size_t * inbytesleft,
char* * outbuf, size_t * outbytesleft);

The iconv function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements *inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted output bytes, and it updates the conversion state contained in cd.

您应该为缓冲区长度使用两个单独的变量:

size_t il = BUF_SIZE - 1 ;
size_t ol = BUF_SIZE - 1 ;

iconv(ic, &text_sjis, &il, &text_utf8, &ol) ;

然后检查iconv的返回值和缓冲区长度是否转换成功。

关于c++ - iconv 只工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104154/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com