C# 如何从剪贴板获取正确编码的HTML?

C# 如何从剪贴板获取正确编码的HTML?,c#,winforms,encoding,clipboard,C#,Winforms,Encoding,Clipboard,有没有人注意到,如果你从剪贴板中检索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"&g

有没有人注意到,如果你从剪贴板中检索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>

不确定MarkDown将如何处理这个问题,但上面的结果标记中有一些奇怪的字符


该漏洞似乎与.NET framework有关。您认为从剪贴板获得正确编码的HTML的最佳方法是什么?

您必须将数据解释为UTF-8。请参阅。

我不知道您的原始源文档是什么,但请注意Word和Outlook以不同的编码提供了剪贴板的多个版本。一个通常是Windows-1252,另一个是UTF-8。当您期待Windows-1252(拉丁文-1+智能引号)时,您可能在默认情况下获取UTF-8编码版本?非ASCII字符将显示为多个奇数拉丁-1重音字符。大多数“智能引号”不是拉丁语-1集,通常是UTF-8中的三个字节


您能指定剪贴板内容的编码吗?

在这种情况下,它不像在我的情况下那样可见。今天我试图从剪贴板复制数据,但有几个unicode字符。我得到的数据就好像我要读一个Windows-1250编码的UTF-8编码文件(我的Windows中的本地编码)

看来你的情况也一样。如果在Windows-1252(或Windows-1250;两者都可以)中保存html数据(请记住在字符后放置不可破坏的空格=0xa0,而不是标准空格)。然后将此文件作为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) (现在,我所有的代码都无法解析数据。在确定应用程序的正确行为时存在另一个问题,该应用程序已经应用了修复程序,但没有修复程序。)

请尝试以下操作:

System.Windows.Forms.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Html);

DataFormats.Html说明它是用UTF-8编码的。但是在.NET4框架和更低版本中有一个bug,它实际上读作UTF-8作为Windows-1252

你得到了错误的编码分配,导致有趣/坏的字符,如 ‘Å’、‘Å’、‘Ž’、‘Å’、‘Å’、‘¸’、‘ã’

这里有完整的解释

Soln:创建翻译词典并搜索和替换