2008-10-27 58 views
6

有沒有人注意到,如果你從剪貼板檢索HTML,它會得到錯誤的編碼並注入奇怪的字符?如何從剪貼板中獲得正確編碼的HTML?

例如,執行這樣的命令:

string s = (string) Clipboard.GetData(DataFormats.Html) 

結果的東西,如:

<FONT size=-2>  <A href="/advanced_search?hl=en">Advanced 
Search</A><BR>  <A href="/preferences?hl=en">Preferences</A><BR>  <A 
href="/language_tools?hl=en">Language 
Tools</A></FONT> 

不知道降價將如何處理這一點,但也有在產生的標記怪異字符以上。

看來,這個錯誤是與.NET框架。您認爲從剪貼板獲得正確編碼的HTML的最佳方法是什麼?

回答

0

我不知道您的原始源文檔是什麼,但請注意,Word和Outlook以不同的編碼提供了多個版本的剪貼板。一個通常是Windows-1252,另一個是UTF-8。當您預計Windows-1252(Latin-1 + Smart Quotes)時,可能默認採用UTF-8編碼版本?非ASCII字符會顯示爲多個奇數拉丁字母重音字符。大多數「智能引號」不在Latin-1集合中,並且通常是UTF-8中的三個字節。

你能指定你想要剪貼板內容的編碼嗎?

3

在這種情況下,它不像我的情況那麼明顯。今天,我試圖從剪貼板複製數據,但有一些unicode字符。我得到的數據好像我會在Windows-1250編碼(本地編碼在我的Windows中)中讀取UTF-8編碼文件。

看來你的情況是一樣的。如果您保存html數據(請記住在Â字符之後放置不可破壞的空間= 0xa0,而不是標準空間)在Windows-1252 (或Windows-1250;兩者都可用)。然後打開這個文件作爲一個UTF-8文件,你會看到應該有什麼。

對於我的其他項目,我做了一個修復數據與損壞的編碼功能。

在這種情況下,簡單的轉換應該足夠了:

byte[] data = Encoding.Default.GetBytes(text); 
text = Encoding.UTF8.GetString(data); 

我最初的功能是多一點點複雜,其中包含測試,以確保數據不被損壞......

public static bool FixMisencodedUTF8(ref string text, Encoding encoding) 
{ 
    if (string.IsNullOrEmpty(text)) 
    return false; 
    byte[] data = encoding.GetBytes(text); 
    // there should not be any character outside source encoding 
    string newStr = encoding.GetString(data); 
    if (!string.Equals(text, newStr)) // if there is any character "outside" 
    return false; // leave, the input is in a different encoding 
    if (IsValidUtf8(data) == 0) // test data to be valid UTF-8 byte sequence 
    return false; // if not, can not convert to UTF-8 
    text = Encoding.UTF8.GetString(data); 
    return true; 
} 

我知道這不是最好的(或正確的解決方案),但我沒有找到任何其他方式如何解決輸入...

編輯(2017年7月20日)

這似乎是微軟已經發現了這個錯誤,現在它工作正常。我不確定這個問題是否出現在某些框架中,但是我確實知道,當我編寫答案時,現在應用程序使用了不同的框架。 (現在是4.5;上一版本爲2.0)

(現在我所有的代碼失敗在解析數據,還有一個問題,以確定應用程序與修復已經應用。查閱全文,並沒有固定正確的行爲。)
0

嘗試此

System.Windows.Forms.Clipboard.GetText(System.Windows.Forms的TextDataFormat .HTML);

0

DataFormats.Htmlspecification聲明它使用UTF-8編碼。但是.NET 4 Framework中存在一個錯誤,並且它實際上讀取爲UTF-8,如Windows-1252

你得到錯誤的編碼分配,導致有趣/壞字符,如 '''''''''''''''''''''''''' 」, 'A', 'A', '¡', 'A¢', 'A£', 'å¤', 'A¥', 'Â|', '§', 'A' , 'A©'

這裏充分說明 Debugging Chart Mapping Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

溶液:創建一個翻譯詞典,搜索和替換。