需要一定的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); 将数据置于系统剪贴板中,并指定在退出应用程序后是否将数据保留在剪贴板中。
源码如下:
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也不会出现乱码的问题了!!