• (转)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

  • 相关阅读:
    【Linux基础】linux下修改ls显示的时间格式
    【Teradata】gtwglobal查看
    【Teradata】tdlocaledef修改默认日期配置
    【Linux基础】文件处理实例
    【Linux基础】awk命令
    【teradata】强制解锁
    第1节:保存文档
    Centos7安装MySQL数据库
    MyBatis框架之异常处理
    spring事务源码分析
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/3017981.html
Copyright © 2020-2023  润新知