2009-09-26 45 views
1

我在這裏對堆棧溢出搜索職位,並閱讀JoelOnSoftware對編碼後,現在有編碼問題一個基本的把握。但是我遇到了來自Windows剪貼板的一些字符編碼問題。C#UTF-8編碼的問題

的重複性測試是使用IE瀏覽器,並選擇從谷歌主頁複製「廣告程序」文本。

我使用下面的C#代碼拉這個文本斷剪貼板(檢查刪除錯誤):

uint FormatId = GetRegisteredClipboardFormatId("HTML Format"); 
IntPtr hHtml = Win32.GetClipboardData(FormatId); 
uint DataSize = Win32.GlobalSize(hHtml); 
byte[] HtmlData = new byte[DataSize]; 
IntPtr pData = Win32.GlobalLock(hHtml); 
Marshal.Copy(pData, HtmlData, 0, (int)DataSize); 
Win32.GlobalUnlock(hHtml); 

剪貼板HTML數據被認爲是UTF-8編碼的,所以使用下面的將數據轉換爲字符串:

string Content = Encoding.UTF8.GetString(HtmlData); 

然而,無視周圍的HTML標籤,這是什麼造成的:

「AdvertisingÂ程序」

我做錯了什麼,誤解了什麼,或者問題出在別處?

感謝您的幫助!

回答

6

您正在爲Latin-1的或其變體(CP1252)顯示UTF-8。

谷歌在那句話,這是C2 A0,這恰好是「 」在Latin-1的使用羣組。

編輯:你在這裏顯示的代碼是好的。我認爲當您顯示content時會出現問題。看起來你輸出的是UTF-8,但顯示媒體正在期待Latin-1。

如果您正在使用控制檯顯示,試試這個,

Console.OutputEncoding = Encoding.GetEncoding("iso-8859-1"); 

這將告訴控制檯發出的Latin-1,而不是UTF-8。

如果要顯示在瀏覽器中的文本,確保網頁上標有UTF-8一樣,

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+0

嗯,我想這會導致兩個問題: 1.如果Encoding類知道它採用UTF-8並輸出Unicode(UTF-16?)字符串,是否應該知道如何將UTF-8中的C2 A0轉換爲Unicode中 的正確表示形式?我假設我誤解了基本級別的編碼問題。關閉做更多的研究... 2.我最終將字符串編碼回UTF-8以在瀏覽器中呈現。爲了方便解析,我只轉換爲.NET字符串。有沒有更好的方式來解析文本的原生UTF-8編碼? – 2009-09-26 22:10:03

+0

查看我的編輯..................... – 2009-09-26 23:55:18

+0

優秀!這個訣竅 - 感謝一堆指針! – 2009-09-27 05:14:30

0

檢查HTML代碼。 「廣告」和「程序」之間有「&nbsp;」 。

與「商業解決方案」文本試試你的代碼,它會工作。

則很可能需要一個正常的空間來替代羣組。