我正在使用 HtmlAgilityPack 读取 html,对其进行编辑,然后将其输出到 StreamWriter。HtmlAgilityPack Encoding 是 Latin1,StreamWriter 是 UnicdeEncoding。
我在转换中丢失了一些字符,我不想这样。
我似乎无法更改 StreamWriter 的编码。解决这个问题的最佳方法是什么?
我正在使用 HtmlAgilityPack 读取 html,对其进行编辑,然后将其输出到 StreamWriter。HtmlAgilityPack Encoding 是 Latin1,StreamWriter 是 UnicdeEncoding。
我在转换中丢失了一些字符,我不想这样。
我似乎无法更改 StreamWriter 的编码。解决这个问题的最佳方法是什么?
如果网页真的是 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 使用它。
猜测;写入 a Stream
(不是 a string
)。如果您写入string
(inc. StringWriter
/ StringBuilder
,您将隐式使用 .NET 的 UTF-16 字符串。
如果您只想调整报告的编码(但使用 a string
),请在此处查看 Jon 的答案。
目前尚不清楚您在哪一端失去了角色。在任何情况下,单纯的编码不匹配本身并不是问题——你仍然应该得到正确的字符。如果 Unicode StreamWriter 写出乱码,这意味着它首先在输入时收到了垃圾。这可能意味着 HtmlAgilityPack 对您的页面进行了错误的编码。如果它具有手动设置编码的选项,您可能只想这样做。
也可能是您的 HTML 页面中包含错误的编码声明。例如,它可能是一个 UTF-8 文件,其中包含将其<meta>
声明为 Latin-1 的元素。你从哪里得到文本?您是直接从 Web 下载它,还是将其保存在文本文件中 - 如果是后者,您如何创建该文件?如果你是通过记事本手动完成的,或者在代码中通过StreamWriter
,那么你可能有一个 UTF-8 文件。