(转)VS2010复制出的代码中文是乱码问题的修复方法

当复制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

原文地址:https://www.cnblogs.com/JuneZhang/p/3017981.html