关于C++和JAVA的编码问题

首先,我的开发环境是64位WIN7,用的工具是VS2005,项目的字符集选择是使用 Unicode 字符集。
在C++中,我定义一个字符串
string keyword("测试1234");
然后输出字符串对应的16进制:
for(string::size_type pos = 0; pos != keyword.size(); pos++)
{
cout <<hex<<(int)keyword[pos];
}
得到的结果是:
ffffffb2ffffffe2ffffffcafffffffd 4313233
|------------- 测试 ------------ | 1234 |
这里我就不理解了,网上查资料说用Unicode字符集是中文字符和英文字符都占2个字节,如果说我的64位WIN7是每个字节16位的话,那每个中文应该是有32位,是该这样解释吗?可是为什么“测试”2个中文占了128位?但是数字“1234”只有这么点?完全不理解啊?
网上说如果字符集选择是多字节使用 多字节字符集 ,那么英文字符和中文字符会占不同的字节数,可是为什么我输出的结果是一样的呢?求解啊,附件中是我这个程序的代码,请高人给看看!

还有,我根据网上的教程,将字符串转换为UTF-8的编码(对方要求是UTF-8编码),然后通过webservice发送给服务端,但是,对方收到的是乱码,这个问题困扰我好久了;但是我用JAVA写一个程序,什么编码转换都没做,直接发送给服务器,那边却不是乱码的,貌似JAVA虚拟机会自动将编码转换为UTF-8,于是我将JAVA生成字符串通过SOCKET发送给C++这边的程序然后在C++程序上接收该字符串并发送给服务端,可是,仍然是乱码的,求解啊!!

谢谢了!!!

2个回答

#include
#include

对于socket中有中文的传输,在接收时我做一次g2u就OK了,你要不要试试
[code="c++"]
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
//int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0)
    return -1;
memset(outbuf,0,outlen);
if ((int)iconv(cd,pin,(size_t *)&inlen,pout,(size_t*)&outlen) == -1)
{
    iconv_close(cd);
    return -1;
}
iconv_close(cd);
return 0;

}

//utf8 --> gb2312
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}

//gb2312 --> utf8
int g2u(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

void convertLLongToChar(long long n, char * ch)
{

//Log->plog(1, "convertLLongToChar() \n");
char p[17];
int k = 0;

while(1)
{
    p[k] = '0' + n%16;
    if(n>=16)
    {
        n = n/16;
    }
    else {
        break;
    }
    k++;
}
p[16] = '\0';
//Log->plog(1, "%s \n", p);

int i = 0;
int j = 15;

for(i =0 ;i<16;i++)
{
    ch[j] = p[i];
    j--;
}
ch[16] = '\0';

}

[/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!