VS2010复制中文乱码修复

18 篇文章 0 订阅
  当复制VS2010中带有中文字符的代码到Office(Word, Excel, PowerPoint, Outlook)时,
在中文字符后面会被添加一到三个乱码。比如复制" 中文字符",粘贴到word就会变成( 中D文?字Á?符¤?)。

 

    通过黑暗执行绪的一篇文章提示,截取剪贴板中RTF(富文本格式)的数据流,并作出修复。该作者使用了 .NET中的正则表达式类RegEx来达到修复目的。方法调用很简单,感兴趣的可以搜索一下作者的博客空间。

 

      我这里给出另一个解决方法:同时截取CF_UNICODETEXTRTF两种剪贴板数据,以CF_UNICODETEXT中的正确数据为参照,对比剔除RTF中的乱码。

 

      写这份代码走了不少弯路,主要是一开始对RTF格式不熟悉,其中的中文接ASCII码处理着实让我差点抓破了头皮。

 

先给出乱码修复截图:

 

 

VS2010CopyModify 

程序添加了全局热键 CTRL+Q 和 监测状态。右下角则是一个动态文字Logo,鼠标移上去就会出现Logo,

移开则改为快捷键说明。编译好的文件这里下载VS2010CopyModify.rar。

 

 

下面贴出程序的核心算法:

 

函数参数说明:

PTSTR        pText     (RTF数据首地址指针,切勿传递剪贴板内存,必须是程序拷贝剪贴板的。)

UINT          iText      (RTF数据大小。单位字节)

LPWSTR    pTextU   (CF_UNICODETEXT数据首地址指针,同上,不可为剪贴板内存。)

UINT          iTextU    (CF_UNICODETEXT数据大小。单位字符)

 

返回值类型  UINT      (修复完后RTF数据的大小。单位字节)


 

/*-------------------------------
  Repair.cpp - 实作乱码修正处理
  -------------------------------*/

#include <windows.h>
#include <string.h>

UINT ClobalRepair ( PTSTR pText , UINT iText , LPWSTR pTextU , UINT iTextU)
{
    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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值