• 最近遇到在将vs2010中的代码拷贝到office2007时代码注释中的中文之间会有乱码解决方案


    需要一定的C#基础(C#对剪切板操、正则表达式)

    最近遇到在将vs2010中的代码拷贝到office2007时代码注释中的中文之间会有乱码

    每二个中文之间会可能会出现的unicod字符:¬¨¢、?、ºy、Y、®¨²、¦Ì、ª3、¬¨´、ã?、°?、¡ã、䨮、¨¬、¡Â、Ì?、¤?、¤¡§、¤¡§、¤¨¤等等。

    解决方案:操作剪贴板使用正则表达式去掉这些乱码

    预备知识:

    C#对剪切板操作的类Clipboard:提供将数据置于系统剪贴板中以及从中检索数据的方法。该类标记为sealed因此无法继承此类。该类的主要方法:

    Clear():清除剪贴板中的内容

    SetData(string format, object data):设置剪贴板中的内容

    GetDataObject():检索当前位于剪切板中的数据,返回IdataObject接口

    类型的数据,(有object GetData(string format):与指定格式关联的数据,或为 null。提供 static 预定义的 Clipboard 格式名称。 使用它们来标识存储在 IDataObject 中的数据的格式。如: DataFormats.Rtf等等;与之对应的是void SetData(object data); string[] GetFormats():返回存储在此实例中的数据所关联的或可以转换为的所有格式的列表。DataObject类,该类继承自IdataObject接口实现该接口如何操作数据

    )

    SetDataObject(object data); 将数据置于系统剪贴板中,并指定在退出应用程序后是否将数据保留在剪贴板中。

     

    源码如下:

    View Code
      1 using System;
      2 
      3 using System.Collections.Generic;
      4 
      5 using System.ComponentModel;
      6 
      7 using System.Data;
      8 
      9 using System.Drawing;
     10 
     11 using System.Linq;
     12 
     13 using System.Text;
     14 
     15 using System.Windows.Forms;
     16 
     17 using System.Text.RegularExpressions;
     18 
     19  
     20 
     21 namespace VS2010复制代码进word出现的中文乱码解决器
     22 
     23 {
     24 
     25     public partial class 乱码解决器 : Form
     26 
     27     {
     28 
     29         public 乱码解决器()
     30 
     31         {
     32 
     33             InitializeComponent();
     34 
     35         }
     36 
     37  
     38 
     39         private void button1_Click(object sender, EventArgs e)
     40 
     41         {
     42 
     43             //取得剪贴板的内容
     44 
     45             IDataObject dataObject = Clipboard.GetDataObject();
     46 
     47             if (dataObject == null)
     48 
     49             {
     50 
     51                 MessageBox.Show("剪贴板中没有任何数据!!");
     52 
     53             }
     54 
     55             else if (dataObject.GetDataPresent(DataFormats.Rtf))
     56 
     57             {
     58 
     59                 //取出RTF格式
     60 
     61                 //string rtf = dataObject.GetData(DataFormats.Rtf) as string;
     62 
     63                 string rtf = dataObject.GetData(DataFormats.Rtf).ToString();
     64 
     65                 //通过正则表达式匹配替换:Regex.Replace去掉多余的字符(不管是否有,一律强制去除)
     66 
     67                 string fixedRtf = Regex.Replace(rtf, @"\\uinput2(?<uc>\\u-?\d*)\s..",
     68 
     69                       (m) =>
     70 
     71                       {
     72 
     73  
     74 
     75                           return m.Groups["uc"].Value + "?";//将剪切板中匹配到的字符替换,也就是去掉二个中文之间多余的乱码
     76 
     77  
     78 
     79                       });
     80 
     81                 //另外新建一个DataObject对象
     82 
     83                 DataObject newDataObject = new DataObject();
     84 
     85                 //RTF格式用修改后的字符串,其余的还原
     86 
     87                 foreach (String t in dataObject.GetFormats())
     88 
     89                 {
     90 
     91                     newDataObject.SetData(t,
     92 
     93                          t == "Rich Text Format" ? fixedRtf :
     94 
     95                            dataObject.GetData(t));
     96 
     97                     //将修改后的内容写入剪贴板
     98 
     99                   
    100 
    101                         Clipboard.SetDataObject(newDataObject, true);
    102 
    103                    
    104 
    105                 }
    106 
    107                 MessageBox.Show("乱码已经清除,您现在可以放心的使用剪切板中的内容了!!");
    108 
    109             }
    110 
    111             else
    112 
    113             {
    114 
    115                 MessageBox.Show("剪切板中的内容无需处理,您可以正常使用内容");
    116 
    117             }
    118 
    119         }
    120 
    121     
    122 
    123    
    124 
    125     }
    126 
    127  
    128 
    129 }

     

     源码下载

    说明:该程序并没有有效的处理非文本数据,如果将从vs中复制的文本先过渡到文本文件后再度复制到word也不会出现乱码的问题了!!

     

    选一种姿态活的无可取代
  • 相关阅读:
    使用两个路由器扩展家庭无线网络
    RX(Reactive Extinsion)和IX(Interactive Extinsion)库改名了
    WPF绘制矢量图形模糊的问题
    WPF的二维绘图(二)——几何图形Geometry
    一个C#语法高亮插件
    WPF的二维绘图(一)——DrawingContext
    在.net桌面程序中自定义鼠标光标
    在WebAPI中自动创建Controller
    解决OneNote的无法同步的问题
    使用NuGet Package Project快速制作NuGet包
  • 原文地址:https://www.cnblogs.com/aolinwxfx/p/2824970.html
Copyright © 2020-2023  润新知