Вопрос о кодировках: как я могу выводить из HtmlAgilityPack в StringWriter и сохранять кодировку?

.net c# encoding html-agility-pack

Вопрос

Я читаю html с помощью HtmlAgilityPack, редактируя его, а затем выводя его в StreamWriter. Кодировка HtmlAgilityPack - Latin1, а StreamWriter - UnicdeEncoding.

Я теряю некоторых символов в преобразовании, и я не хочу быть.

Кажется, я не могу изменить кодировку StreamWriter. Что лучше всего в этой проблеме?

Принятый ответ

Если веб-страница действительно латинская-1 (ISO-8859-1), она не может иметь никаких курчавых цитат; Latin-1 не имеет сопоставлений для этих символов. Если вы видите курсорные кавычки при открытии страницы в своем браузере, они могут быть в виде объектов HTML ( “ и ” or “ and ” ). Но я подозреваю, что кодировка страницы действительно является окном-1252, несмотря на то, что говорят заголовки и встроенные объявления.

windows-1252 идентичен латинскому-1, за исключением того, что он заменяет управляющие символы в диапазоне \x80..\x9F (decimal 128..159 ) более полезными (или, по крайней мере, более 128..159 ) печатными символами. Если HtmlAgilityPack принимает страницу под своим словом и расшифровывает ее как ISO-8859-1, она преобразует \x93 в управляющий символ \u0093 , который будет выглядеть как мусор, если вы можете его отобразить вообще. Браузер, тем временем, преобразует его в \u201C , кодовую точку Unicode для отметки Left Double Quotation Mark.

Я не знаком с HtmlAgilityPack, и я не могу найти никаких документов для него, но я бы попытался заставить его использовать windows-1252. Например, вы можете создать StreamReader Windows-1252 (или «ANSI») и использовать HAP.


Ответ эксперта

На догадку; пишите в Stream (не string ). Если вы пишете в string (вкл. StringWriter / StringBuilder , вы неявно с помощью строки .NET в UTF-16.

Если вы просто хотите настроить кодировку с сообщением (но используйте string ), посмотрите на ответ Джона.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему