Символы в строке изменились после загрузки HTML из Интернета

Используя следующий код, я могу загрузить HTML-файл из Интернета:

WebClient wc = new WebClient(); // .... string downloadedFile = wc.DownloadString("http://www.myurl.com/"); 

Однако иногда файл содержит «интересные» символы, такие как é to é , to ↠и フシギダネ フシギダム.

Я думаю, что это может быть связано с разными типами юникода или чем-то другим, так как каждый персонаж меняется на 2 новые, возможно, каждый персонаж разделяется пополам, но у меня мало знаний в этой области. Как вы думаете, что неправильно?

Вот загруженный class, который поддерживает gzip и проверяет заголовок и метаtags кодирования, чтобы правильно его декодировать.

GetPage() classа и вызовите GetPage() .

 public class HttpDownloader { private readonly string _referer; private readonly string _userAgent; public Encoding Encoding { get; set; } public WebHeaderCollection Headers { get; set; } public Uri Url { get; set; } public HttpDownloader(string url, string referer, string userAgent) { Encoding = Encoding.GetEncoding("ISO-8859-1"); Url = new Uri(url); // verify the uri _userAgent = userAgent; _referer = referer; } public string GetPage() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); if (!string.IsNullOrEmpty(_referer)) request.Referer = _referer; if (!string.IsNullOrEmpty(_userAgent)) request.UserAgent = _userAgent; request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { Headers = response.Headers; Url = response.ResponseUri; return ProcessContent(response); } } private string ProcessContent(HttpWebResponse response) { SetEncodingFromHeader(response); Stream s = response.GetResponseStream(); if (response.ContentEncoding.ToLower().Contains("gzip")) s = new GZipStream(s, CompressionMode.Decompress); else if (response.ContentEncoding.ToLower().Contains("deflate")) s = new DeflateStream(s, CompressionMode.Decompress); MemoryStream memStream = new MemoryStream(); int bytesRead; byte[] buffer = new byte[0x1000]; for (bytesRead = s.Read(buffer, 0, buffer.Length); bytesRead > 0; bytesRead = s.Read(buffer, 0, buffer.Length)) { memStream.Write(buffer, 0, bytesRead); } s.Close(); string html; memStream.Position = 0; using (StreamReader r = new StreamReader(memStream, Encoding)) { html = r.ReadToEnd().Trim(); html = CheckMetaCharSetAndReEncode(memStream, html); } return html; } private void SetEncodingFromHeader(HttpWebResponse response) { string charset = null; if (string.IsNullOrEmpty(response.CharacterSet)) { Match m = Regex.Match(response.ContentType, @";\s*charset\s*=\s*(?.*)", RegexOptions.IgnoreCase); if (m.Success) { charset = m.Groups["charset"].Value.Trim(new[] { '\'', '"' }); } } else { charset = response.CharacterSet; } if (!string.IsNullOrEmpty(charset)) { try { Encoding = Encoding.GetEncoding(charset); } catch (ArgumentException) { } } } private string CheckMetaCharSetAndReEncode(Stream memStream, string html) { Match m = new Regex(@"[A-Za-z0-9_-]+)""?", RegexOptions.Singleline | RegexOptions.IgnoreCase).Match(html); if (m.Success) { string charset = m.Groups["charset"].Value.ToLower() ?? "iso-8859-1"; if ((charset == "unicode") || (charset == "utf-16")) { charset = "utf-8"; } try { Encoding metaEncoding = Encoding.GetEncoding(charset); if (Encoding != metaEncoding) { memStream.Position = 0L; StreamReader recodeReader = new StreamReader(memStream, metaEncoding); html = recodeReader.ReadToEnd().Trim(); recodeReader.Close(); } } catch (ArgumentException) { } } return html; } } 

Поскольку мне не разрешено комментировать (недостаточная репутация), мне придется опубликовать дополнительный ответ. Я обычно использую class Mikael, но я столкнулся с практической проблемой с регулярным выражением, которое пытается найти мета-информацию charset. Эта

 Match m = new Regex(@"[A-Za-z0-9_-]+)", RegexOptions.Singleline | RegexOptions.IgnoreCase).Match(html); 

терпит неудачу

  

тогда как это

 Match m = new Regex(@"[A-Za-z0-9_-]+)""?", RegexOptions.Singleline | RegexOptions.IgnoreCase).Match(html); 

не.

Спасибо, Микаэль.

Попробуй это

 string downloadedFile = wc.DownloadString("http://www.myurl.com"); 

Я всегда удаляю последний «Слэш», и он до сих пор работал как шарм. Но я тоже могу быть опасным

  • Как я могу программным образом удалить 2 ограничения соединения в WebClient
  • Как я могу заставить WebClient использовать Cookies?
  • C # webclient и прокси-сервер
  • Как получить код статуса из веб-клиента?
  • Загрузка файлов на файловый сервер с использованием classа webclient
  • Печально известная, но без ответа проблема загрузки файла, когда требуется защита Windows
  • Возможно ли передать аутентификацию из Webbrowser в WebRequest
  • Как заполнить формы и отправить с помощью Webclient в C #
  • Использование WebClient или WebRequest для входа на веб-сайт и доступа к данным
  • Выбор между HttpClient и WebClient
  • Как отправить данные на определенный URL-адрес с помощью WebClient в C #
  • Interesting Posts

    Можно ли читать данные Firebase без подключения слушателей?

    База данных с предварительным заполнением Android

    Генерировать hash из UIImage

    Как включить новый просмотр инспектора 3D-страниц в Firefox 11

    Какова роль content_main.xml в android studio 1.4?

    Формат тела веб-службы RESTful

    java: нестатическая переменная не может ссылаться на статический контекст Ошибка

    Переход на вкладки вправо или влево от текущей вкладки в Notepad ++

    Eclipse Indigo – Не удается установить плагин Android ADT

    В чем же нуждается JSF, когда пользовательский интерфейс может быть достигнут с помощью библиотек JavaScript, таких как jQuery и AngularJS

    Поверните изображение на 90, 180 или 270 gradleусов

    Как объединить несколько встроенных объектов стиля?

    Нет хорошего примера о RecyclerView и StaggeredGridLayoutManager в Android Docs

    Как получить фид комментариев, введенных через поле «чат» во время прямой трансляции YouTube?

    Предотвращение автоматического удаления Outlook 2010 Outlook 2010

    Давайте будем гением компьютера.