关于产品编码:我从HtmlAgilityPack输出到的StringWriter和如何保持编码?
-
12-09-2019 - |
题
我正在读的HTML与HtmlAgilityPack,编辑它,然后将它输出到一个StreamWriter。所述HtmlAgilityPack编码是Latin1的,并且是的StreamWriter UnicdeEncoding。
我失去的转换一些字符,我不想要的。
我似乎不能够改变一个StreamWriter的编码。什么是解决这个问题的最好?
解决方案
如果网页是真正的Latin-1(ISO-8859-1),它不能有任何弯引号; Latin-1的对这些字符没有映射。如果你能看到弯引号当您在浏览器中打开网页,他们可以在HTML实体(“
和”
或“
和”
)的形式。但我怀疑网页的编码是真正的窗口1252,尽管什么头和嵌入式声明说。
窗口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
(INC。StringWriter
/ StringBuilder
,你是隐式使用。NET的UTF-16字符串。
如果你只是想调整的报告编码(但使用string
),然后看Jon的回答这里。
目前尚不清楚其结束你在失去字符。在任何情况下,仅仅编码不一致本身不是一个问题 - 你仍然应该得到正确的字符。如果一个Unicode的StreamWriter写出乱码,这意味着它已经摆在首位收到垃圾输入。这可能意味着HtmlAgilityPack了编码为您的网页错误。如果有手动设置编码的选项,你可能想做到这一点。
这也可能是你有中有一个错误编码申报的HTML页面。例如。它可能是一个UTF-8文件,其中包含<meta>
元件声明为Latin-1的。你在哪里得到的文本?你从网上下载它直,还是有它在一个文本文件 - 如果是后者,你如何创建一个文件?如果通过手动记事本做到了,或者在经由StreamWriter
代码,则可能有一个UTF-8文件。