这里的问题不是HTML解码,而是文本在一个字符集(例如,windows-1252)中编码,然后再次编码为第二个(UTF-8).
在UTF-8中,•被解码为E2 80 A2.使用windows-1252编码读取此字节序列时,E2 80 A2编码为•.(再次保存为UTF-8 •成为C3 A2 E2 82 AC C2 A2 20 54 65 73 74.)
如果文件是windows-1252编码的文件,则可以使用正确的编码简单地读取文件(例如,作为StreamReader构造函数的参数).
new StreamReader(..., Encoding.GetEncoding("windows-1252"));
Run Code Online (Sandbox Code Playgroud)
如果使用不正确的编码保存文件,则在某些情况下可以反转编码.例如,对于问题中的字符串序列,您可以编写:
string s = "•"; // the string sequence that is not properly encoded
var b = Encoding.GetEncoding("windows-1252").GetBytes(s); // b = `E2 80 A2`
string c = Encoding.UTF8.GetString(b); // c = `•`
Run Code Online (Sandbox Code Playgroud)
请注意,许多常见的非打印字符的范围是U+2000到U+2044(参考),如"智能引号",子弹和破折号.因此,序列â€?(其中?是任何字符)通常表示这种类型的编码错误.这样可以更广泛地纠正此类错误:
static string CorrectText(string input)
{
var winencoding = Encoding.GetEncoding("windows-1252");
return Regex.Replace(input, "â€.",
m => Encoding.UTF8.GetString(winencoding.GetBytes(m.Value)));
}
Run Code Online (Sandbox Code Playgroud)
使用以这种方式格式错误的文本调用此函数将纠正一些(但不是全部)错误.例如,CorrectText("•Test–or“")将返回预期的•Test–or“.
HtmlDecode 用于将 Html 编码的字符串转换为可读的字符串格式。也许HtmlEncode这就是您真正在寻找的东西。