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

本文关键字:编码 HTML 获取 剪贴板 | 更新日期: 2023-09-27 17:47:23

有没有人注意到,如果你从剪贴板检索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框架有关。 您认为从剪贴板获取正确编码的HTML的最佳方法是什么?

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

在这种情况下,

它不像我的情况那样明显。今天我尝试从剪贴板复制数据,但有一些 unicode 字符。我得到的数据就好像我会读取Windows-1250编码(Windows中的本地编码)的UTF-8编码文件一样。

看来你的情况是一样的。如果在 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;
}

我知道这不是最好的(或正确的解决方案),但我没有找到任何其他方法来解决输入......

编辑(七月20,2017)

似乎Microsoft已经发现了此错误,现在它可以正常工作。我不确定问题是否出在某些框架中,但我肯定知道,现在应用程序使用不同的框架,就像我写答案时一样。(现在是4.5;以前的版本是2.0)(现在我的所有代码都无法解析数据。确定已应用修复且未修复的应用程序的正确行为还有另一个问题。

您必须将数据解释为 UTF-8。 请参阅 MS Office 超链接更改代码页?。

DataFormats.Html规范声明它是用UTF-8编码的。但是在.NET 4 Framework及更低版本中有一个错误,它实际上读作Windows-1252的UTF-8

你会得到错误的编码,导致有趣/坏的角色,如"Å"、"Å"、"Å1/2"、"Å"、"Å"、"Å3/4"、"Å ̧"、"Å"、"Á"、"Â"、"©

Æ"、"Å"、"Æ"、"Å

完整解释在这里调试图表将 Windows-1252 字符映射到 UTF-8 字节到拉丁语 1 字符

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

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

您能否指定希望剪贴板内容采用哪种编码?

试试这个:

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