如何将网页解码为 UTF8 而不管其编码

How to decode a webpage into UTF8 regardless of its encoding

我在 C# 中使用 WebClient.DownloadFile 下载网页。它们下载正常,但编码通常不明确(不存在 BOM)。 Mozilla 通用字符集检测器(port 1, port 2) provides a system to detect the encoding of plaintext files using heuristics and this 提供了一种更简单的方法,可以识别更少的编码。

那么首先,HTML 网页是否甚至使用 Shift-JIS 和 EUC-KR 等奇怪的编码进行编码?如果不是,则可以使用一种更快的检测方法,假设某些内容是 ASCII/ANSI 或 UTF8。

其次,即使在检测到编码之后,如何将文件的 byte[] 解码为适当的 UTF8 字符串?在进行了一些字符串处理之后,我可以使用 UTF8 BOM 将文件保存回磁盘吗?或者我是否必须在 HTML 文件中添加额外的标签,如 <meta charset="utf-8"..">

网页的字符集应该content-type reponse header, especially the charset attribute描述,但通常不是。有时会有一个 <meta http-equiv="content-type" />,但即使缺少它,所有的赌注都会被取消,您需要去检测实际的编码。

看来您的前进方向是正确的。

are HTML web pages even encoded in strange encodings

这取决于您请求的页面。

how does one go about decoding the byte[] of the file into an appropriate UTF8 string?

你不想。 .NET 中的字符串在内部全部编码为 UTF-16,并且所有实用程序函数都使用该格式。

所以 string content = Encoding.GetEncoding(yourDetectedEncoding).GetString(contentBytes) 就可以了。

然后您可以将这个 UTF-16 编码的 content 字符串写回 UTF-8 编码的文件,BOM 为:

File.WriteAllText(path, content, Encoding.UTF8);