0 0

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

首先,我的开发环境是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++程序上接收该字符串并发送给服务端,可是,仍然是乱码的,求解啊!!

谢谢了!!!

问题补充:
xiangjie88 写道
对于socket中有中文的传输,在接收时我做一次g2u就OK了,你要不要试试
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';
}


请问你这是用conv的吗?我在WIN7下好像没这个东西的?

问题补充:
xiangjie88 写道
#include <iconv.h>
#include <string.h>

终于解决了,原来我调用webservice发送的时候也需要将发送编码设置为UTF-8的模式
2012年5月10日 09:21

2个答案 按时间排序 按投票排序

0 0

采纳的答案

#include <iconv.h>
#include <string.h>

2012年5月10日 11:51
0 0

对于socket中有中文的传输,在接收时我做一次g2u就OK了,你要不要试试

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';
}

2012年5月10日 09:29

相关推荐

    java c++ 通信之间的乱码解决方法

    Java和C++之间进行Socket通信时,可能会遇到乱码问题,主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C++在Windows XP环境下可能使用GBK编码。解决这个问题的关键在于确保数据在传输过程中保持正确的...

    C++转Java工具

    通常,JNI开发涉及到大量的手动编码和测试,错误和不兼容性可能会成为问题。有了这样的转换工具,开发者可以节省大量时间,减少手动转换和调试的工作量。 文件列表中包含了"C++ to Java Converter.exe.config"和...

    aes c/c++和java互通

    总的来说,AES在C/C++和Java之间的互通涉及到密钥管理、加密模式选择、数据编码和解码,以及相应的库函数调用。通过合理的设计和实现,可以确保两个平台之间加密数据的安全传输。具体实现细节可以参考提供的示例代码...

    C++和JAVA网络通信实例

    C++和Java作为两种广泛应用的编程语言,都有强大的网络编程能力。本实例通过C++实现服务端,Java实现客户端,展示了这两种语言如何进行有效的网络通信。 首先,C++的网络通信主要依赖于标准模板库(STL)中的`...

    C++和JAVA,AES/ECB/PKCS5Padding 互通

    在IT领域,尤其是在网络安全和数据加密方面,C++和Java之间的互通性是一个常见的需求。这里的“C++和JAVA,AES/ECB/PKCS5Padding 互通”指的是使用相同的加密算法,即高级加密标准(AES)的电子密码本模式(ECB)和...

    文《关于c++与java中文乱码问题分析与解决》中一个bug分析1

    在C++和Java之间进行数据交换时,常常会遇到中文乱码的问题,这主要是由于编码格式不一致导致的。文章《关于C++与Java中文乱码问题分析与解决》深入探讨了这一问题,并提供了一个解决方案。该解决方案涉及到使用`...

    C++与Java混合编程

    3. **实现C++代码**:在`WinFile.cpp`中实现Java方法对应的功能,并处理字符编码转换。 ```cpp #include "jni.h" #include "WinFile.h" extern "C" { JNIEXPORT jstring JNICALL Java_WinFile_...

    编码规范(C++、Java)

    2. **Java编码规范** - **命名规则**:Java推荐使用帕斯卡命名法(PascalCase)为类名,小驼峰命名法camelCase为变量和函数名,常量全大写,单词间用下划线分隔。 - **注释**:JavaDoc是一种标准的注释格式,用于...

    c++客户端和java(Netty)服务器端tcp通讯

    在Java中,Netty提供了一个名为ProtobufDecoder和ProtobufEncoder的类,它们可以帮助我们自动地对protobuf消息进行解码和编码。 当C++客户端需要向Java服务器发送数据时,先序列化protobuf消息,然后通过socket发送...

    java与C++互通加解密

    本次项目由于服务器之间需要通信加密,java和c++,自己只懂java,因此和同事(c)在网上找了好几个都测试不行,我们修改了其中一个,已通过测试,上传的是最基础的,需要复杂化的可自行修改。为了以后方便他人,贡献...

    java与c++传文件程序

    在IT行业中,跨平台通信是常见的需求之一,Java和C++作为两种广泛应用的编程语言,它们之间的文件传输能力尤其重要。本项目实现了一个基于Socket的文件传输方案,其中Java作为服务端,C++作为客户端,使得Windows...

    c AES, c++ AES, java AES, 互通, 加密解密

    总的来说,实现跨平台的AES加密解密需要深入理解AES算法本身,掌握C/C++和Java的底层机制,以及如何在不同环境中处理字节序问题。这是一个挑战性的任务,但通过编写和优化代码,你可以实现高效且安全的数据交换。

    java调用C++ webservice

    在IT行业中,跨语言通信是常见的需求,尤其是在Java和C++这样的不同编程环境中。本话题主要探讨如何使用Java调用由C++实现的Web服务(Webservice)。在给出的描述中,提到了通过WSDL(Web Services Description ...

    C++&java电子教程

    《C++&Java电子教程》是一份专为初学者设计的综合学习资源,涵盖了C++和Java这两种重要的编程语言的基础知识。这份教程旨在帮助零基础的学习者快速入门,理解编程的基本概念,掌握这两种语言的核心技能。 C++是...

    Haffman编码的简单源程序(C、C++、JAVA)

    - **哈夫曼编码 -- 程序.txt** 可能是用某种编程语言(可能是C、C++或JAVA)编写的哈夫曼编码程序的源代码。 - **哈夫曼编码构造 c++程序.txt** 显然是C++语言实现哈夫曼编码的源代码。 - **哈夫曼编译码的C语言程序...

    C++ Java编码规范

    在软件开发过程中,编码规范是保证代码质量和可维护性的重要基石。C++和Java作为两种广泛...通过阅读C++编码规范及示例.doc、JAVA编码规范及示例.doc、Google-C++编码规范.pdf,开发者可以更深入地理解并应用这些规则。

    Java c++ socket通信

    例如,都使用UTF-8编码,否则可能会遇到字符乱码问题。同时,数据格式也需要统一,比如JSON或自定义的二进制格式。 在实际应用中,Java和C++的Socket通信常用于分布式系统、微服务架构中,其中Java负责提供API或Web...

    C++调用Javawebservice.pdf

    2.2.3 监视SOAP请求和响应 当C++代码执行到调用Web Service的地方时,MS SOAP Toolkit的Trace Utility会显示SOAP消息的发送和接收情况。这有助于调试和理解通信过程。 2.3 不使用MS SOAP Tookit 3.0监视 如果你不...

    RSA体系 c++/java相互进行加签验签

    1. 兼容性:由于C++和Java的实现可能略有不同,因此需要确保密钥和数据格式的一致性,例如,通常会使用Base64编码来处理二进制数据。 2. 密钥生成:在每个平台上都需要生成相应的公钥和私钥对,这可以通过OpenSSL库...

Global site tag (gtag.js) - Google Analytics