晓寒的小屋

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
晓寒 阅读(1487) 评论(3)
在使用Ice通信的是,如果使用c++语言的一方向使用C#的一方传输的数据中包含有中文字符的话,就会有麻烦了。因为c#默认使用的是utf8编码,而c++默认的则是多字符集。如果不信,你可以测试Ice自带的demo,然后使用C++语言的Invoke中的Server,然后把getValues对应的值修改为中文,并使用C#的client测试看看。具体解决办法是:设置C++的工程为unicode,并且设置每一个cpp和头文件。

这些都是好办的,就是所谓的unicode编程。但是我当时遇到了配置文件的问题。我使用c++写了一个服务器(server),并把服务器的名字放在了配置文件中。然后使用C#写的client端,在client启动的时候需要获得server的名字,这时候问题就出来了:服务器的名字不能被client正常解析!为什么呢?因为配置文件的格式不是utf8的。所以把配置文件的格式修改为uft8后,一切都ok了。当然了,你也可以把配置文件中的服务器名字读取出来,然后转化他。我使用了[IWASWZQ]的转化。我是在写入配置文件的时候转化。
具体代码如下:
bool Convert(char*  strSource, char* strDest,  int  sourceCodepage,  int  targetCodepage)  
{  
    
try
    
{
        
int  len= strlen(strSource);

        
int  unicodeLen=MultiByteToWideChar(sourceCodepage,0,strSource,-1,NULL,0);  

        wchar_t            
*  pUnicode;  
        pUnicode
=new  wchar_t[unicodeLen+1];  

        memset(pUnicode,
0,(unicodeLen+1)*sizeof(wchar_t));  


        MultiByteToWideChar(sourceCodepage,
0,strSource,-1,(LPWSTR)pUnicode,unicodeLen);  

        BYTE  
*  pTargetData;  
        
int  targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,NULL,0,NULL,NULL);  

        pTargetData
=new  BYTE[targetLen+1];  
        memset(pTargetData,
0,targetLen+1);  

        WideCharToMultiByte(targetCodepage,
0,(LPWSTR)pUnicode,-1,(char  *)pTargetData,targetLen,NULL,NULL);  

        sprintf(strDest, 
"%s", pTargetData);

        delete  pUnicode;  
        delete  pTargetData;  
    }

    
catch ()
    
{
        
return false;
    }


    
return true;
}
  

我是把它写为一个nsis可以使用dll了,然后再安装程序中直接可以让用户配置的。NSIS使用dll写起来和普通dll有些不同,具体写法参考次连接:

评论列表
jzhang
re: Ice中,CPP2CS通信中包含中文的解决方法。
ice能在那些平台上运行?他的通信是二进制编码的吗?
Adeniyi
Always the best content from these proiogidus writers.

发表评论
切换编辑模式