9

有没有人注意到,如果你从剪贴板中检索 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 的最佳方法是什么?

4

5 回答 5

3

在这种情况下,它不像我的情况那样明显。今天我试图从剪贴板复制数据,但有几个 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;
}

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

编辑(2017 年 7 月 20 日)

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

于 2013-09-28T15:07:51.950 回答
1

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

于 2008-10-27T05:41:57.263 回答
1

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

你得到分配错误的编码,导致有趣/坏的字符,如'Å','‹','Å'','Ž','Å¡','Å“','ž','Ÿ ','Â','¡','¢','£','¤','Â¥','¦','§','¨','©'

此处的完整说明 Debugging Chart Mapping Windows-1252 Characters to UTF-8 Bytes to Latin-1 Characters

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

于 2016-06-28T05:47:15.493 回答
0

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

你能指定你想要剪贴板内容的编码吗?

于 2013-07-08T17:15:54.753 回答
0

尝试这个:

System.Windows.Forms.Clipboard.GetText(System.Windows.Forms.TextDataFormat.Html);
于 2015-04-15T22:58:22.807 回答