1

我正在使用 HtmlAgilityPack 读取 html,对其进行编辑,然后将其输出到 StreamWriter。HtmlAgilityPack Encoding 是 Latin1,StreamWriter 是 UnicdeEncoding。

我在转换中丢失了一些字符,我不想这样。

我似乎无法更改 StreamWriter 的编码。解决这个问题的最佳方法是什么?

4

3 回答 3

1

如果网页真的是 Latin-1 (ISO-8859-1),它不能有任何花括号;Latin-1 没有这些字符的映射。如果您在浏览器中打开页面时可以看到花引号,则它们可能是 HTML 实体的形式(“and”“and ”)。但我怀疑页面的编码实际上是 windows-1252,尽管标题和嵌入式声明说了什么。

windows-1252 与 Latin-1 相同,只是它将\x80..\x9F范围(十进制128..159)中的控制字符替换为更有用(或至少更漂亮)的打印字符。如果 HtmlAgilityPack 按其单词获取页面并将其解码为 ISO-8859-1,它将转换\x93为控制字符\u0093,如果您可以让它显示的话,它看起来就像垃圾一样。同时,浏览器会将其转换\u201C为左双引号的 Unicode 代码点。

我对 HtmlAgilityPack 不熟悉,也找不到任何文档,但我会尝试强制它使用 windows-1252。例如,您可以创建一个 windows-1252(或“ANSI”)StreamReader 并让 HAP 使用它。

于 2009-07-13T02:19:21.257 回答
0

猜测;写入 a Stream(不是 a string)。如果您写入string(inc. StringWriter/ StringBuilder,您将隐式使用 .NET 的 UTF-16 字符串。

如果您只想调整报告的编码(但使用 a string),请在此处查看 Jon 的答案

于 2009-07-12T10:21:14.360 回答
0

目前尚不清楚您在哪一端失去了角色。在任何情况下,单纯的编码不匹配本身并不是问题——你仍然应该得到正确的字符。如果 Unicode StreamWriter 写出乱码,这意味着它首先在输入时收到了垃圾。这可能意味着 HtmlAgilityPack 对您的页面进行了错误的编码。如果它具有手动设置编码的选项,您可能只想这样做。

也可能是您的 HTML 页面中包含错误的编码声明。例如,它可能是一个 UTF-8 文件,其中包含将其<meta>声明为 Latin-1 的元素。你从哪里得到文本?您是直接从 Web 下载它,还是将其保存在文本文件中 - 如果是后者,您如何创建该文件?如果你是通过记事本手动完成的,或者在代码中通过StreamWriter,那么你可能有一个 UTF-8 文件。

于 2009-07-12T10:52:34.313 回答