2016-04-18 3 views
0

Я использую WebClient.DownloadFile в C# для загрузки веб-страниц. Они загружаются в порядке, но кодировка часто неоднозначна (никакой спецификации нет). Универсальный детектор кодировки Mozilla (port 1, port 2) предоставляет систему для обнаружения кодирования файлов открытого текста с использованием эвристики, а this обеспечивает еще более простой метод, который распознает меньшее количество кодировок.Как декодировать веб-страницу в UTF8 независимо от ее кодировки

Так что, во-первых, веб-страницы HTML даже закодированы в странных кодировках, таких как Shift-JIS и EUC-KR? Если нет, то можно использовать более быстрый метод обнаружения, предполагающий, что что-то есть ASCII/ANSI или UTF8.

Во-вторых, даже после обнаружения кодировки, как сделать декодирование byte[] файла в соответствующую строку UTF8? И после выполнения строковой обработки я могу сохранить файл обратно на диск с помощью спецификации UTF8? Или мне нужно добавить дополнительные теги, например <meta charset="utf-8"..">, в HTML-файл?

+0

У меня была такая же проблема. Заявленное кодирование иногда совершенно неверно (не говоря уже о том, что оно объявлено в тексте веб-страницы, которое необходимо сначала декодировать http://www.w3schools.com/tags/att_meta_charset.asp), спецификация почти всегда отсутствует. Я думаю, что эвристика - единственное разумное решение. –

ответ

1

Набор символов веб-страницы должен быть описанным content-type reponse header, especially the charset attribute, но обычно это не так. Иногда есть <meta http-equiv="content-type" />, но когда даже этого не хватает, все ставки отключены, и вам нужно найти фактическую кодировку.

Итак, вы, кажется, находитесь на правильном пути вперед.

являются HTML веб-страницы, даже закодированные в странных кодировок

Это зависит от страниц, которые вы запрашиваете.

Как сделать декодирование байта [] файла в соответствующую строку UTF8?

Вы не хотите. Строки в .NET кодируются как UTF-16 внутренне, и все служебные функции работают с этим форматом.

Так что string content = Encoding.GetEncoding(yourDetectedEncoding).GetString(contentBytes) будет делать все отлично.

Тогда вы можете написать это UTF-16 закодированы content строку обратно в UTF-8 кодировке, с BOM:

File.WriteAllText(path, content, Encoding.UTF8); 
+0

«Соответствующая строка UTF8?» Я имел в виду строковый формат, который нужен C#. Итак, вы, UTF-16. –

+0

@ Харш-да, так что это UTF-16. – CodeCaster

Смежные вопросы