2009-09-26 46 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;” 。

与“商业解决方案”文本试试你的代码,它会工作。

则很可能需要一个正常的空间来替代群组。