当复制VS2010中带有中文字符的代码到Office(Word, Excel, PowerPoint, Outlook)时,
在中文字符后面会被添加一到三个乱码。比如复制"中文字符",粘贴到word就会变成(中D文?字Á?符¤?)。
通过黑暗执行绪的一篇文章提示,截取剪贴板中RTF(富文本格式)的数据流,并作出修复。该作者使用了 .NET中的正则表达式类RegEx来达到修复目的。方法调用很简单,感兴趣的可以搜索一下作者的博客空间。
我这里给出另一个解决方法:同时截取CF_UNICODETEXT和RTF两种剪贴板数据,以CF_UNICODETEXT中的正确数据为参照,对比剔除RTF中的乱码。
写这份代码走了不少弯路,主要是一开始对RTF格式不熟悉,其中的中文接ASCII码处理着实让我差点抓破了头皮。
先给出乱码修复截图:
编译好的文件这里下载VS2010CopyModify.rar。
下面贴出程序的核心算法:
函数参数说明:
PTSTR pText (RTF数据首地址指针,切勿传递剪贴板内存,必须是程序拷贝剪贴板的)
UINT iText (RTF数据大小。单位字节)
LPWSTR pTextU (CF_UNICODETEXT数据首地址指针,同上,不可为剪贴板内存。)
UINT iTextU (CF_UNICODETEXT数据大小。单位字符)
返回值类型UINT (修复完后RTF数据的大小。单位字节)
View Code
/*------------------------------- Repair.cpp - 实作乱码修正处理 -------------------------------*/ #include <windows.h> #include <string.h> UINT ClobalRepair (PTSTRpText,UINTiText,LPWSTRpTextU,UINTiTextU) { const PTSTR tZ= "//uinput2//u", tA = "//cf0//par", tP = "//par"; TCHAR AnsiT[11]; PTSTR pTextS = pText, pTextW = NULL, pAnsiT = AnsiT; PTCHAR pTextK = NULL; UINT i,iU,iC = 0,iR= 0, UTRange = 10; BOOL bAnsi=FALSE; LPWSTR pTextUW = pTextU; long int iM; while(TRUE) { // 查找/uinput2/u pTextS =strstr(pTextS,tZ); if(pTextS==NULL) break; // 指向Unicode编码的首字节 pTextS =&pTextS[UTRange]; // 获取Unicode编码的十六进制值 iM =strtol(pTextS,&pTextK,10); // 修正负数补码的问题 iM =iM& 0xFFFF; pTextS =pTextK; pTextS =&pTextS[1]; pTextS[0]=' '; pTextS =&pTextS[1]; // 在Unicode数据中对焦中文字符 for (iU=0; iU < iTextU;iU++) { if(pTextUW[iU]==iM) { pTextUW = &pTextUW[iU+1]; iTextU -= (iU+1); break; } } // 中文接中文的处理 if (pTextUW[0]>0x80) { pTextW = strstr(pTextS,tZ); iC =pTextW- pTextS; i =pTextS- pText; iR =i+ iC; for (i=0; iR <= iText;i++,iR++) pTextS[i]=pTextW[i]; iText -= iC; continue; } // 文档尾的处理 if(pTextUW[0]==NULL) { pTextW = strstr(pTextS,tP); iC =pTextW- pTextS; i =pTextS- pText; iR =i+ iC; for (i=0; iR <= iText;i++,iR++) pTextS[i]=pTextW[i]; iText -= iC; continue; } // 换行符、回车及水平制表 if (pTextUW[0]==0x0D || pTextUW[0]==0x09) { pTextW = strstr(pTextS,tA); iC =pTextW- pTextS; i =pTextS- pText; iR =i+ iC; for (i=0; iR <= iText;i++,iR++) pTextS[i]=pTextW[i]; iText -= iC; continue; } // 中文接ASCII的处理 if (pTextUW[0]<=0x80 && pTextUW[0]>=0x20) { for (i=0; i < 11;i++) AnsiT[i]=NULL; pAnsiT = AnsiT; for (iR=0; iR < 4&& ((pTextUW[iR]<=0x80) && (pTextUW[iR]>=0x20)); iR++) { if (pTextUW[iR]==0x5C || pTextUW[iR]==0x7B || pTextUW[iR]==0x7D) { pAnsiT[0]='//'; pAnsiT = &pAnsiT[1]; pAnsiT[0]=pTextUW[iR]; pAnsiT = &pAnsiT[1]; } else { pAnsiT[0]=pTextUW[iR]; pAnsiT = &pAnsiT[1]; } } if (strlen(AnsiT)<=3) AnsiT[iR]='//'; pTextW = pTextS; pTextW = strstr(pTextS,AnsiT); if(pTextW==NULL) { bAnsi = FALSE; pTextW = pTextS; for (iC=0; TRUE; iC++) { if ((pTextW[iC]=='//' && pTextW[iC-1]!='//') && (pTextW[iC+1]=='c' || pTextW[iC+1]=='p') && (pTextW[iC+2]=='f' || pTextW[iC+2]=='a') && (pTextW[iC+3]=='0' || pTextW[iC+3]=='r')) { pTextW = &pTextW[iC]; break; } } while(TRUE) { if (pTextW[0]==AnsiT[0]) { if (AnsiT[0]=='//') { if (pTextW[1]==AnsiT[1]) break; } else { if (AnsiT[1]!=NULL && pTextW[1]==AnsiT[1]) break; else { if(pTextW[1]=='//' && (pTextW[2]=='c'|| pTextW[2]=='p') && (pTextW[3]=='f'|| pTextW[3]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } if (AnsiT[2]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]) { if (AnsiT[2]=='//') { if (pTextW[3]==AnsiT[3]) break; } else { if (AnsiT[3]!=NULL && pTextW[3]==AnsiT[3]) break; else { if (pTextW[3]=='//' && (pTextW[4]=='c' || pTextW[4]=='p') && (pTextW[5]=='f' || pTextW[5]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } if (AnsiT[3]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]&&pTextW[3]==AnsiT[3]) { if (AnsiT[3]=='//') { if (pTextW[4]==AnsiT[4]) break; } else { if (AnsiT[4]!=NULL && pTextW[4]==AnsiT[4]) break; else { if (pTextW[4]=='//' && (pTextW[5]=='c' || pTextW[5]=='p') && (pTextW[6]=='f' || pTextW[6]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } if (AnsiT[4]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]&&pTextW[3]==AnsiT[3]&& pTextW[4]==AnsiT[4]) { if (AnsiT[4]=='//') { if (pTextW[5]==AnsiT[5]) break; } else { if (AnsiT[5]!=NULL && pTextW[5]==AnsiT[5]) break; else { if (pTextW[5]=='//' && (pTextW[6]=='c' || pTextW[6]=='p') && (pTextW[7]=='f' || pTextW[7]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } if (AnsiT[5]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]&&pTextW[3]==AnsiT[3]&& pTextW[4]==AnsiT[4]&&pTextW[5]==AnsiT[5]) { if (AnsiT[5]=='//') { if (pTextW[6]==AnsiT[6]) break; } else { if (AnsiT[6]!=NULL && pTextW[6]==AnsiT[6]) break; else { if (pTextW[6]=='//' && (pTextW[7]=='c' || pTextW[7]=='p') && (pTextW[8]=='f' || pTextW[8]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } if (AnsiT[6]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]&&pTextW[3]==AnsiT[3]&& pTextW[4]==AnsiT[4]&&pTextW[5]==AnsiT[5]&& pTextW[6]==AnsiT[6] ) { if (AnsiT[6]=='//') { if (pTextW[7]==AnsiT[7]) break; } else { if (AnsiT[7]!=NULL && pTextW[7]==AnsiT[7]) break; else { if (pTextW[7]=='//' && (pTextW[8]=='c' || pTextW[8]=='p') && (pTextW[9]=='f' || pTextW[9]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } if (AnsiT[7]!=NULL && bAnsi !=TRUE) { while(TRUE) { if (pTextW[0]==AnsiT[0]&&pTextW[1]==AnsiT[1]&& pTextW[2]==AnsiT[2]&&pTextW[3]==AnsiT[3]&& pTextW[4]==AnsiT[4]&&pTextW[5]==AnsiT[5]&& pTextW[6]==AnsiT[6]&&pTextW[7]==AnsiT[7]) { if (AnsiT[7]=='//') { if (pTextW[8]==AnsiT[8]) break; } else { if (AnsiT[8]!=NULL && pTextW[8]==AnsiT[8]) break; else { if (pTextW[8]=='//' && (pTextW[9]=='c' || pTextW[9]=='p') && (pTextW[10]=='f' || pTextW[10]=='a')) { bAnsi = TRUE; break; } } } } pTextW = &pTextW[-1]; } } } iC =pTextW- pTextS; i =pTextS- pText; iR =i+ iC; for (i=0; iR <= iText;i++,iR++) pTextS[i]=pTextW[i]; iText -= iC; continue; } } return iText; }
分享自:http://blog.csdn.net/guandq2106/article/details/7001290