【问题标题】:How to decode a webpage into UTF8 regardless of its encoding无论其编码如何,如何将网页解码为 UTF8
【发布时间】:2016-08-10 01:58:32
【问题描述】:

我在 C# 中使用WebClient.DownloadFile 来下载网页。它们下载得很好,但编码通常不明确(不存在 BOM)。 Mozilla 通用字符集检测器(port 1port 2)提供了一个使用启发式检测纯文本文件编码的系统,this 提供了一种更简单的方法,可以识别更少的编码。

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

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

【问题讨论】:

  • 我遇到了同样的问题。声明的编码有时是完全错误的(更不用说在网页的文本中声明了,需要先解码w3schools.com/tags/att_meta_charset.asp),BOM 几乎总是丢失。我认为启发式是唯一合理的解决方案。

标签: c# encoding utf-8 character-encoding webpage


【解决方案1】:

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

所以你似乎走在正确的道路上。

HTML 网页甚至以奇怪的编码方式编码

这取决于您请求的页面。

如何将文件的 byte[] 解码为适当的 UTF8 字符串?

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

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

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

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

【讨论】:

  • appropriate UTF8 string? 我的意思是 C# 需要的字符串格式。所以你,UTF-16。
  • @Harsh 是的,那就是 UTF-16。
猜你喜欢
  • 2014-06-23
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多