- 论坛徽章:
- 0
|
本帖最后由 zhanhorse 于 2014-02-17 10:03 编辑
中文字符编码UTF8转换为GBK时候报错,请大侠指导!
UNIX环境:
HP-UX B.11.31 U ia64 (ta)
$ aCC -mt +DD64 -D_RWSTD_ALLOCATOR #-xvector=lib -xO5 UTF8TOGBK.cpp -o UTF8TOGBK
$ ./UTF8TOGBK
姝e?ㄥ??瑁?
iconv open fail
这个库函数iconv.h是存在
$ ls -lrt i*
-r--r--r-- 1 bin bin 2676 Feb 16 2007 iconv.h
-r--r--r-- 1 bin bin 1459 Feb 16 2007 initptr.h
-r--r--r-- 1 bin bin 14188 Feb 16 2007 inttypes.h
-r--r--r-- 1 bin bin 746 Feb 16 2007 iovalid.h
-r--r--r-- 1 bin bin 646 Feb 16 2007 iso646.h
extern iconv_t iconv_open __((const char *, const char *));
extern size_t iconv __((iconv_t, char ** __restrict, size_t * __restrict, char ** __restrict, size_t * __restrict));
extern int iconv_close __((iconv_t));
#include <iostream>
#include <iconv.h>
using namespace std;
string IConvert(const string &sInput)
{
string sOutput;
char *pin = (char*)sInput.data();
size_t inlen = sInput.length() * 4;
size_t outlen = inlen;
char *pout = new char[outlen];
memset(pout, 0, outlen);
iconv_t cd = 0;
if((cd = iconv_open("gbk", "utf-8")) == (iconv_t)-1)
{
cout << "iconv open fail \n";
return sOutput;
}
// 不知道iconv内部是如何实现的,必须这样再进行一次赋值才不会出错
char *pin1 = pin, *pout1 = pout;
char **ppin = & pin1;
char **ppout = & pout1;
size_t inleft = inlen, outleft = outlen;
//if(iconv(cd, (const char**)ppin, &inleft, ppout, &outleft) == size_t(-1))
if(iconv(cd, (char**)ppin, &inleft, ppout, &outleft) == size_t(-1))
{
iconv_close(cd);
cout << "convert fail\n" << errno << endl;
return sOutput;
}
iconv_close(cd);
sOutput.assign(pout, outlen - outleft);
delete []pout;
return sOutput;
};
int main(int argc, char* argv[])
{
//char *in_utf8 = "姝e?ㄥ??瑁?";
//char *in_gb2312 = "正在安装";
//cout << argv[1] << endl;
string utf8str("姝e?ㄥ??瑁?");
cout << utf8str << endl;
cout << IConvert(utf8str) << endl;;
return 0;
}
|
|