2012-07-06 57 views
0

我一直在努力转换属性的html值,但没有取得任何成功。通过C#将Html utf-8字符集转换为ISO-8859-1

这里是我试图转换的HTML(确保charset不会显示在这里,但是,我完全按照您的看法来看它)。

<a href="https://sistemas.usp.br/jupiterweb/listarGradeCurricular?codcg=12&amp;codcur=12012&amp;codhab=1&amp;tipo=N" target="_blank">Administração – São Paulo – diurno</a> 

好的,这个htmlnode的值是“Administração - SãoPaulo - diurno”。

我使用HtmlAgilityPack来分析这种情况的HtmlPage,一旦我达到这个节点,它的innerText值仅是这样的:Administração â São Paulo â diurno

我假设了页面的原始字符集是UTF-8,因为这就是html上的编码标签对我说了什么。

如何将这个奇怪的字符串转换为:Administração - São Paulo - Diurno

我已经尝试过这些线程:thread onethread two 并没有什么解决我的问题

编辑:我通过一个C#的WebRequest获取得到的页面。

EDIT2:新增HtmlAgilityPack标签

问题分离:的WebRequest有时搞乱的HTML。

有没有其他的方法来设置编码?我试图:_webReq.Encoding =“ISO-8859-1”

在此先感谢

+0

我相信你应该HtmlAgilityPack标记它,就像那是哪里出了问题。你是从数据库中检索这些数据吗?如果你把探查器放在上面,数据是否正确显示? – 2012-07-06 14:01:14

+0

我会编辑以使其更清晰,并用HtmlAgilityPack对其进行标记。 我通过webrequest c获取页面# – 2012-07-06 14:02:00

+1

这也很重要。我相信你可以通过WebRequest设置编码,给我一分钟 – 2012-07-06 14:04:01

回答

2

小试后,就可以看到该字符串不正确编码越来越回到它原来的形式。

样品测试:

var item = "Administração - São Paulo - Diurno"; 
Console.WriteLine(item); 

var buffer = Encoding.UTF8.GetBytes(item); 
var item2 = Encoding.Default.GetString(buffer); 
Console.WriteLine(item2); 

此打印:

Administraçao - Sao Paulo - Diurno 
AdministraA§A£o - SA£o Paulo - Diurno 

正如你所看到的,原始的字符串被转换为使用UTF8个字节,但随后被转换回字符串使用Default编码。

这是错误的。

如果WebRequest.GetResponse()返回错误值的字符串,那么该方法存在问题。尝试将HttpWebRequest上的TransferEncoding属性设置为UTF8。

在设置TransferEncoding属性之前,必须先将SendChunked属性设置为true。通过将TransferEncoding设置为null来清除对SendChunked的值没有影响。分配给TransferEncoding属性的值将替换任何现有内容。

或者您可以尝试在打开的StreamReader上将编码设置为UTF8。我可以看到你的代码吗?

+0

谢谢,我的请求的编码设置为UTF-8解决了它 – 2012-07-06 14:35:03

0

我解决:

HtmlWeb Webget = new HtmlWeb(); 
    HtmlDocument doc = new HtmlDocument(); 
    Webget.AutoDetectEncoding = false; 
    Webget.OverrideEncoding = Encoding.UTF8; 

    doc_tmp.OptionOutputAsXml = true; 
    doc_tmp.OptionReadEncoding = true; 
    doc_tmp.OptionFixNestedTags = true; 
    doc_tmp.OptionDefaultStreamEncoding = Encoding.UTF8; 

      doc_tmp.LoadHtml(tmp.InnerHtml); 
      doc_tmp.Save(Console.Out);