进程间管道通信,有时会出现部分中文乱码,哪位高手有经验的说说
进程间管道通信,有时会出现部分中文乱码,谁有经验的说说?
在vc6.0下,匿名管道通信。
用匿名管道实现进程间同信,类似于QQ聊天界面。两个进程聊天。比如:父进程给子进程发送中文文本。发送文本的时候,一份发送到自己的编辑框控件,一份发送到子进程,然后子进程显示在自己的编辑框中。
可是有时候这个进程说的一句话,在自己这边好好的,到了另一个进程中这句话的最后几个字就变成乱码了。
这是为什么?
------解决方案--------------------
发送文字时,都用unicode编码
------解决方案--------------------
估计数据传错了,应该不是编码的问题,如果两边都用同样的编码
------解决方案--------------------
另一个进程中接受到的汉字有没有半个汉字的情况?
------解决方案--------------------
不要使用流式传输。
使用消息块。
struct
{
unsigned long _size;
WCHAR _szMessage[1];
};
------解决方案--------------------
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//recestr是全局变量
后看看接受到什么?
------解决方案--------------------
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//
你这个‘50’有可能把一个汉字分成2个,一个在这行的尾部,另半个在下行头部,
需要一个子程序来鉴别。
------解决方案--------------------
手打的:
在vc6.0下,匿名管道通信。
用匿名管道实现进程间同信,类似于QQ聊天界面。两个进程聊天。比如:父进程给子进程发送中文文本。发送文本的时候,一份发送到自己的编辑框控件,一份发送到子进程,然后子进程显示在自己的编辑框中。
可是有时候这个进程说的一句话,在自己这边好好的,到了另一个进程中这句话的最后几个字就变成乱码了。
这是为什么?
------解决方案--------------------
发送文字时,都用unicode编码
------解决方案--------------------
估计数据传错了,应该不是编码的问题,如果两边都用同样的编码
------解决方案--------------------
另一个进程中接受到的汉字有没有半个汉字的情况?
------解决方案--------------------
不要使用流式传输。
使用消息块。
struct
{
unsigned long _size;
WCHAR _szMessage[1];
};
------解决方案--------------------
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//recestr是全局变量
后看看接受到什么?
------解决方案--------------------
ReadFile(hReadPipe,recestr,50,&byteread,NULL);//
你这个‘50’有可能把一个汉字分成2个,一个在这行的尾部,另半个在下行头部,
需要一个子程序来鉴别。
------解决方案--------------------
手打的:
- C/C++ code
#define SZ 1 BYTE *KillHalfHZ(BYTE *pData,UINT len) { static BYTE HalfHZ=0; BYTE firstHalf=0; UINT HalfAt=0; UINT total=0; BYTE *copy=0; BYTE *pTmp=0; // if(HalfHZ !=0) {// add last half HZ to new line copy=new BYTE[len+1+SZ]; memset(copy,0,len+1+SZ); copy[0]=HalfHZ; HalfHZ=0; memcpy(©[1],pdata,len); total=len+1; } else {// keep original copy=new BYTE[len+SZ]; memset(copy,0,len+SZ); memcpy(copy,pdata,len); total=len; } pTmp=copy; // check this new line for(UINT i=0;i<total;i++) { if(*pTmp >= 0x80) { if(firstHalf==0) { firstHalf = *pTmp; HalfAt = i+1; } else {// has half HZ if(i == HalfAt) {// 1 hz firstHalf=0; HalfAt=0; } else {// *pTmp='?' } } } pTmp++; } if(HalfAt == 0) { // new line no half HZ copy[total]=0; } else if (HalfAt==total) {// new line has half HZ at end HalfHZ= firstHalf; copy[total-1]=0;// sz } // delete it after use return copy; } 调用时给原读来的数组和长度,返回后直接使用新产生的copy。 BYTE *pstr=KillHalfHZ(pData,len); replace到edit。 用完delete []pstr