Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6461
Последний выпуск: 19.06.2015

C#: распознать кодировку

48K
19 мая 2009 года
atukal
3 / / 19.05.2009
Собственно проблема заключается в том, что есть 2 типа файлов, в одних текст сохранён в кодировке UTF8 в других - Windows-1251 и необходимо переконвертировать файлы Windows-1251 в UTF8, с UTF8 ничего не делать. Как определить кодировку файла? Я Не знаю заведомо в какой кодировке сохранён файл.

Пробовал
 
Код:
StreamReader sr = new StreamReader(s, true); //true - определить кодировку, но sr.CurrentEncoding показывает что кодировка Encoding.UTF8
9
19 мая 2009 года
Lerkin
3.0K / / 25.03.2003
А префикса в UTF8 файле нету?
48K
19 мая 2009 года
atukal
3 / / 19.05.2009
Префикс? типа имя файла вида utf8_144545.txt, win-1251_3243222.txt?? нет все файлы имеют имя \d{1,5}.txt

Есть только фолдер с файлами различной кодировки, необходимо чтобы все файлы стали в UTF8.
9
19 мая 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: atukal
Префикс? типа имя файла вида utf8_144545.txt, win-1251_3243222.txt?? нет все файлы имеют имя \d{1,5}.txt

Есть только фолдер с файлами различной кодировки, необходимо чтобы все файлы стали в UTF8.


Я про первые 3 байта в файле.

Цитата:
[FONT="Courier New"][SIZE="2"]UTF-8 (EF BB BF)
UTF-16 big-endian (FE FF)
UTF-16 little-endian (FF FE)
UTF-32 big-endian (00 00 FE FF)
UTF-32 little-endian (FF FE 00 00)[/SIZE][/FONT]



Читаешь первые три байта файла. И если они равны 0xEF 0xBB 0xBF, то файл должен быть в UTF-8. Правда, это условие не всегда выполняется.

48K
19 мая 2009 года
atukal
3 / / 19.05.2009
К сожалению юникод файлы сохранены без сигнатуры
9
19 мая 2009 года
Lerkin
3.0K / / 25.03.2003
Ну тогда, поскольку символы в UTF-8 определяются последовательностями от 1 до 4 байт, можно попробовать анализ по маске первого байта в коде.
14
19 мая 2009 года
Phodopus
3.3K / / 19.06.2008
В общем случае задача непростая, но зная что далеко не каждая комбинация символов допустима в UTF8, полагаясь на интернациональные символы можно попробовав раскодировать исходный файл по UTF8 предположить его кодировку.
12
20 мая 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Lerkin
Я про первые 3 байта в файле.


Читаешь первые три байта файла. И если они равны 0xEF 0xBB 0xBF, то файл должен быть в UTF-8. Правда, это условие не всегда выполняется.


Что-то мне говорить, что это BOM ;)

12
20 мая 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Phodopus
В общем случае задача непростая, но зная что далеко не каждая комбинация символов допустима в UTF8, полагаясь на интернациональные символы можно попробовав раскодировать исходный файл по UTF8 предположить его кодировку.


На сколько я помню как раз утф-8 проще всего и распознать. На практике в утф-8 используется от 1 до 4 байт. Два первых старших бита в первом байте всегда установлены в единицу. С учетом BOM-а нужно прочитать первых 7 байт. Для полной гарантии и определения размерности байт на символ конечно лучше прочесть все же первые 11. Собственно по ним и будет видно.

14
20 мая 2009 года
Phodopus
3.3K / / 19.06.2008
М-м-м.. Все же скажу хоть первый раз не собрался :). Насколько помню я, по стандарту, UTF8 может отводить на 1 символ до 6 байт. Вот даж прям счаз лезть проверять лень :). Ну просто не факт что последовательности из5-6 байт за чем-то закреплены. А английский текст на UTF8 выглядит аналогично ANSI, поэтому я и говорю что задача непростая (имеется ввиду нет у нее четкого алгоритмического решения). А вот если символ из некоей национальной кодировки (занимает несколько байт) то да, вплоть до последнего байта некоторые биты в начальных байтах играют роль флагов. Но эти же байты не запрещены в ANSI что делает отнесение потока к ANSI/UTF не совсем тривиальной задачей
86
20 мая 2009 года
Kogrom
2.7K / / 02.02.2008
Теоретически, текст может отличаться только тем, что в UTF-8 невозможны некоторые комбинации байтов, которые используются в ANSI.

Таким образом, можно попытаться переводить текст (с неизвестной кодировкой) из UTF-8 в ANSI и ловить исключение. Если текст был в кодировке ANSI, то может быть сгенерировано исключение.

Это ленивый метод, который в теории может сработать.
14
20 мая 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Kogrom
Таким образом, можно попытаться переводить текст (с неизвестной кодировкой) из UTF-8 в ANSI и ловить исключение. Если текст был в кодировке ANSI, то может быть сгенерировано исключение.


Ну вообщем я пропагандировал этот же подход. Дополнительно, если возможно основываться на некоем формате/содержимом обрабатываемых файлов можно искать какие-либо шаблоны. Например распространенные слова языка.

12
20 мая 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Phodopus

М-м-м.. Все же скажу хоть первый раз не собрался :). Насколько помню я, по стандарту, UTF8 может отводить на 1 символ до 6 байт.


Правильно помнишь. Но я подчеркивал:

Цитата: alekciy

На практике в утф-8 используется от 1 до 4 байт.


Улавливаешь разницу? ;)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог