在这种情况下,它不像我的情况那样明显。今天我试图从剪贴板复制数据,但有几个 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)
(现在我的所有代码都无法解析数据。还有另一个问题是确定应用程序的正确行为,修复已经应用但没有修复。)