Преобразование кодировки HTML utf-8 в ISO-8859-1 через C #

Я безуспешно пытался преобразовать html-значение атрибута.

Вот HTML, который я пытаюсь преобразовать (конечно, кодировка здесь не будет отображаться, но я вижу ее именно так, как вы ее видите).

<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>

Хорошо, ЗНАЧЕНИЕ этого HTML-узла - «Администрация - Сан-Паулу - дневной».

Я использую HtmlAgilityPack для анализа HtmlPage для этого, и как только я достигну этого узла, его значение innerText будет примерно таким: Administração â São Paulo â diurno

Я предполагаю, что исходная кодировка страницы - UTF-8, потому что это то, что мне говорит тег кодирования в html.

Как мне преобразовать эту странную строку в: Administração - São Paulo - Diurno?

Я уже пробовал эти темы: первый поток и второй поток и ничего не решило мою проблему

РЕДАКТИРОВАТЬ: я получаю страницу с помощью C # WebRequest Get.

EDIT2: добавлен тег HtmlAgilityPack

Проблема была изолирована: WebRequest иногда портит Html.

Есть ли другой способ установить кодировку? я пытаюсь: _webReq.Encoding = "ISO-8859-1"

заранее спасибо


person Marcello Grechi Lins    schedule 06.07.2012    source источник
comment
Я считаю, что вам следует пометить его с помощью HtmlAgilityPack, похоже, в этом проблема. Вы получаете эти данные из базы данных? Если поставить на него профилировщик, данные отображаются правильно?   -  person Andre Calil    schedule 06.07.2012
comment
Я отредактирую, чтобы было понятнее, и помечу его как HtmlAgilityPack. Я получаю страницу через webrequest c #   -  person Marcello Grechi Lins    schedule 06.07.2012
comment
Это тоже важно. Я считаю, что вы можете установить кодировку при получении через WebRequest, дайте мне минуту   -  person Andre Calil    schedule 06.07.2012
comment
Да, можно, сейчас попробую.   -  person Marcello Grechi Lins    schedule 06.07.2012
comment
Установите кодировку ISO-8859-1, не сработало.   -  person Marcello Grechi Lins    schedule 06.07.2012
comment
Если вы установите точку останова после получения ответа, правильно ли отображается контент? Я пытаюсь изолировать запрос или HtmlAgilityPack.   -  person Andre Calil    schedule 06.07.2012
comment
Нет, html приходит с ошибками сразу после запроса, так что это WebRequest. Спасибо за это, теперь мы знаем, на чем сосредоточиться   -  person Marcello Grechi Lins    schedule 06.07.2012


Ответы (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, но затем он преобразуется обратно в строку с использованием Кодировка по умолчанию.

Это не правильно.

Если WebRequest.GetResponse () возвращает строку как неправильное значение, значит, с этим методом возникла проблема. Попробуйте установить для свойства TransferEncoding в HttpWebRequest значение UTF8.

Прежде чем вы сможете установить свойство TransferEncoding, вы должны сначала установить для свойства SendChunked значение true. Очистка TransferEncoding путем установки для него значения null не влияет на значение SendChunked. Значения, присвоенные свойству TransferEncoding, заменяют любое существующее содержимое.

Или вы можете попробовать установить кодировку UTF8 в StreamReader, который вы открываете. Могу я увидеть ваш код?

person Tom    schedule 06.07.2012

я решил:

    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);
person elle0087    schedule 20.04.2017