FIX-修正VS2010剪貼程式碼時中文夾雜亂碼問題

Abstract: VS2010 RTM has a bug.  When copying code and pasting it to Word, Excel, Powerpoint, Outlook, there are one or two redundent characters following the non-ASCII characters.  I wrote a tool as a workaround.

許多人應該都發現了, VS2010在處理程式碼剪貼時有個明顯Bug--將含顏色標示的程式碼貼到Office(Word, Excel, PowerPoint, Outlook)時,中文部分會夾雜亂碼。例如: "每個中文字後會連著一到兩個多餘字元"會變成"每LC個O中?文a字r後a會P|連s著gU一@到Li兩La個O多h餘l字r元¡M"。

這實在是個惱人的問題,像我常需要將程式碼貼在Word或Outlook中。原本在VS2008裡,選取並複製程式碼,在Office裡貼上時,可保留語法中的不同顏色標記,美觀又大方。但到了VS2010,貼成RichText格式時中文部分會有夾雜亂碼的問題,但貼上為純文字時則正常。原本兩個動作可以完成的任務,現在要嘛得手動將多餘字元刪掉,不然就得仰賴其他Syntax Highlight機制,十分不便。

研究了一下這個問題,發現是放進Clipboard裡的內容出現多餘字元,於是我用C#寫了一個小工具,取出剪貼內容,用Regex修改後再貼回去,就可修正這個問題囉!

程式原理很簡單,用Clipboard.GetDataObject()取出RTF剪貼內容,用Regex把有問題的部分換掉(Regular Expression好威呀!),再把修正後的結果放進剪貼簿,如此而已,幾行程式就搞定了: (.NET好威呀!)

//每個中文字後會連著一到兩個多餘字元
private void btnFix_Click(object sender, EventArgs e)
{
    //取得剪貼簿內容
    IDataObject dataObject = Clipboard.GetDataObject();
    if (dataObject.GetDataPresent(DataFormats.Rtf))
    {
        //取出RTF格式
        string rtf = dataObject.GetData(DataFormats.Rtf) as string;
        //以Regex.Replace去除多餘字元(註: 不管是否有問題,一律強制處理)
        string fixedRtf =
            Regex.Replace(rtf, @"\\uinput2(?<uc>\\u-?\d*)\s..",
            (m) =>
            {
                return m.Groups["uc"].Value + "?";
            });
        //另建新DataObject物件
        DataObject newDataObject = new DataObject();
        //RTF格式用修正後的字串,其餘依原值
        foreach (String t in dataObject.GetFormats())
            newDataObject.SetData(t,
                t == "Rich Text Format" ? fixedRtf :
                dataObject.GetData(t));
        //將修正後內容寫入剪貼簿
        Clipboard.SetDataObject(newDataObject, true);
    }
}

有需要的朋友可以下載回去使用,或是DIY自行編譯上述程式碼。(下載格式為.7z,請使用7-Zip解壓縮;因只有VS2010的使用者會需要,所以我編譯成.NET 4.0)

若覺得好用請幫忙按個"讚"(其實沒地方可以按,開玩笑的 XD),並歡迎留言回饋指教!

歡迎推文分享:
Published 03 June 2010 10:11 AM 由 Jeffrey
Filed under: ,
Views: 34,010



意見

# Ruddy Lee said on 02 June, 2010 07:30 PM

恭喜! 年度最快速解決方案供獻獎!  ....(提名)

# Morris said on 05 June, 2010 09:34 AM

# 阿尼 said on 07 June, 2010 11:30 PM

# bauann said on 15 June, 2010 03:39 AM

讚,推到twitter ~

# David said on 17 June, 2010 06:37 AM

讚, 堪稱本月最優小工具....^_^

# cc said on 25 June, 2010 03:24 AM

谢谢你了!

小而犀利的工具!

# neksterlader said on 01 July, 2010 03:13 AM

讚啦~~

Regular Expression好威呀!

NET好威呀!

黑暗執行緒大大好威呀!

# DeltaCat said on 08 July, 2010 12:22 AM

赞,灰常不错

# fbzl said on 06 August, 2010 06:25 AM

# mis2000lab said on 13 September, 2010 09:19 PM

相見恨晚啊~~~~

要不是有朋友推薦這篇文章,我還在用手工方法解決呢.....

感恩。

# 小中中 said on 14 September, 2010 11:48 PM

讚~!

# iNowForDream said on 07 December, 2010 05:55 AM

# fantasyer said on 28 December, 2010 11:26 PM

lihai!  

# 飞晏 said on 18 February, 2011 10:38 AM

非常不错,简洁高效的代码。

# Vincent said on 18 October, 2012 07:15 AM

相当不错,谢谢,有东西又有原理源码,辛苦了

# 大灰狼 said on 11 May, 2014 12:02 AM

# Shirley said on 06 December, 2015 09:56 AM

好棒~~~大大的赞~\(≧▽≦)/~~多谢作者!

# 孫守真 said on 12 August, 2016 06:41 AM

剛才發現從2016版 Offce VBA 複製的程式碼也有類似這這問題,凡中文皆變亂碼 從外部複製貼進 VBA 則中文皆成??(問號)。可能也是寫入剪貼簿時的bug ,不知版主可曾研究這個問題。目前可有解決之道?

# 孫守真 said on 12 August, 2016 07:27 AM

更正剛才的。發現問題出在系統語言環境,因我在win10增了英文(美國)語言,沒有切換過來中文(繁體,台灣)語言時,就發生這種VBA剪貼簿錯亂的問題。但其他程式不會,可見仍是VBA本身環境的問題。

只要在中文(繁體,台灣)下複製、貼上,便沒有亂碼的問題了。

剛剛試驗,若先在美語環境下複製了,再切回中文環境貼上,則仍會;須在中文環境複製下,才能貼上正常。可見是在複製時將資料寫入剪貼簿,依當前誩環境作編碼,輸出(貼上)時,則依此編碼字來輸出,如是而已。南無阿彌陀佛

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<June 2010>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication