有没有人注意到如果你从剪贴板中检索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的最佳方法是什么?
答案 0 :(得分:3)
在这种情况下,它不像我的情况那样可见。今天我试图从剪贴板复制数据,但有一些unicode字符。我得到的数据好像是在Windows-1250编码(我的Windows中的本地编码)中读取UTF-8编码文件。
看来你的情况是一样的。如果在Windows-1252 (或Windows-1250;两者都有效)中保存html数据(记得在Â字符后面放置不可破坏的空格= 0xa0,而不是标准空间) / em>的。然后将此文件作为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日)
似乎Microsoft已经发现此错误,现在它可以正常工作。我不确定问题是否存在于某些框架中,但我确信,现在应用程序在编写答案时使用了不同的框架。 (现在是4.5;之前的版本是2.0) (现在我的所有代码都无法解析数据。还有另一个问题是确定应用程序的正确行为,修复程序已经应用并且没有修复。)
答案 1 :(得分:1)
您必须将数据解释为UTF-8。请参阅MS Office hyperlinks change code page?。
答案 2 :(得分:0)
这是您可以修改到剪贴板的PowerShell脚本,以更改任何编码问题。
http://www.johndcook.com/blog/2008/10/17/manipulating-the-clipboard-with-powershell/
答案 3 :(得分:0)
我不知道您的原始源文档是什么,但请注意Word和Outlook以不同的编码提供了多个版本的剪贴板。一个通常是Windows-1252,另一个是UTF-8。当您期待Windows-1252(Latin-1 + Smart Quotes)时,您可能会默认抓取UTF-8编码版本?非ASCII字符将显示为多个奇数Latin-1重音字符。大多数“智能引号”不在Latin-1集中,通常是UTF-8中的三个字节。
您可以指定希望剪贴板内容的编码吗?
答案 4 :(得分:0)
试试这个
System.Windows.Forms.Clipboard.GetText(System.Windows.Forms的的 TextDataFormat 强> .HTML。);
答案 5 :(得分:0)
DataFormats.Html manual page表示它以UTF-8编码。但是.NET 4 Framework中有一个错误并且更低,它实际上读作UTF-8为 Windows-1252 。
你会得到一些错误的编码,导致有趣/不好的角色如 'A', 'A€¹','A ' 'å½', 'Å¡',' A '“, '¾', 'A', 'A', '¡',' A¢ ”, 'A£', 'å¤', 'A¥', 'Â|', '§', 'A', 'A©'
这里有完整的解释 specification
Soln:创建翻译词典并搜索和替换。