2008-10-27 84 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

溶液:创建一个翻译词典,搜索和替换。