关于编码的问题:如何从HtmlAgilityPack输出到StringWriter并保持编码?

.net c# encoding html-agility-pack

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

我在转换中失去了一些角色,我不想成为。

我似乎无法更改StreamWriter的编码。围绕这个问题最好的是什么?

一般承认的答案

如果网页真的是Latin-1(ISO-8859-1),它就不能有任何卷曲引号; Latin-1没有这些字符的映射。如果你能看到弯引号当您在浏览器中打开网页,他们可以在HTML实体的形式( “”“”但我怀疑页面的编码实际上是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使用它。


专家解答

猜测;写入Stream (不是string )。如果你写一个string (包括StringWriter / StringBuilder ,你隐式使用.NET的UTF-16字符串。

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因