哎,找了半天转换,找到了ICONV,据说是跨平台的,很牛。下载的libxml也需要到他,也下载了他的库,由于libxml转换编码格式。
可是用来用去都不正确。网上去找的资料都是一个版本的,我最后的代码为:
bool charToUtf_8(IN const char* strSrc, IN OUT char** pstrDst)
{
//u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
iconv_t cd = iconv_open("utf-8", "ANSI_X3.4-1986");
//iconv_t cd = iconv_open("utf-8", "CP_ACP");
if (cd == (iconv_t)(-1))
{
return false;
}
size_t ilen = ::strlen(strSrc) + 1;
size_t olen = ilen * 4;
char *inbuf = new char[ilen];
char *outbuf = new char[olen];
memset(inbuf, 0, ilen);
memset(outbuf, 0, olen);
const char *in = inbuf;
char *out = outbuf;
//
memcpy(inbuf, strSrc, ilen);
size_t ret = iconv(cd, &in, &ilen, &out, &olen);
//下面这种方式会出错,为什么?
//size_t ret = iconv(cd, &inbuf, &ilen, &outbuf, &olen);
// if (ret == (size_t)(-1))
// {
// cerr << "iconv error" << endl;
// }
// else
// {
// cout << outbuf << endl;
// }
delete[] inbuf;
delete outbuf;
iconv_close(cd);
return true;
}
当然这些代码是从网上拷贝下来再改的。编译通过,运行就不行了。
后来我放弃了。直接用windows的方法。(还好我是在windows上开发)
bool CharToUtf_8(IN const char* strSrc, IN OUT char** pstrDst)
{
assert(pstrDst);
int nSize = MultiByteToWideChar(CP_ACP,NULL, strSrc, -1, NULL, 0);
WCHAR* pwchTemp = new WCHAR[nSize];
nSize = MultiByteToWideChar(CP_ACP,NULL, strSrc, -1, pwchTemp, nSize);
nSize = WideCharToMultiByte(CP_UTF8, NULL, pwchTemp, -1, NULL, 0, 0, 0);
*pstrDst = new char[nSize];
nSize = WideCharToMultiByte(CP_UTF8, NULL, pwchTemp, -1, *pstrDst, nSize, 0, 0);
return true;
}
这样就可以饿了。呵呵。。哎。。。。
不过挺郁闷的,为什么ICONV不能用啊,有高手指点一下吗?