免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1393 | 回复: 0
打印 上一主题 下一主题

[C++] 中文字符编码UTF8转换为GBK时候报错! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-17 09:57 |只看该作者 |倒序浏览
本帖最后由 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;   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP