Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автодетект кодировки, Есть куча файлов в разных кодировках 
V
    Опции темы
Softaz
Дата 31.12.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



С помощью которых инструментов можно это сделать?

То есть нужно прочитать до конца текстовый файл и представить его в читаемом виде.
Как вариант возможно конвертирование в UTF8.
Проблема одна - узнать, в которой кодировке читать файл?


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
mr.DUDA
Дата 31.12.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232





--------------------
user posted image
PM MAIL WWW   Вверх
Softaz
Дата 1.1.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: 3
Всего: 16



mr.DUDA, понятно.
Вопрос, в принципе, снят, но если кто знает железное решение - милости просим в тему


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
Stepan_Lameroff
Дата 1.1.2007, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Вот изчо пост с RSDN:
Автоопределение кодировки

А вот вариант решения при помощи StreamReader:

Код

        public static int ReadInput(TextReader sourceTextReader, byte[] target, int start, int count)
        {
            if (target.Length == 0) 
                return 0;

            char[] charArray = new char[target.Length];
            int bytesRead = sourceTextReader.Read(charArray, start, count);

            if (bytesRead == 0) 
                return -1;

            for (int index = start; index < start + bytesRead; index++)
                target[index] = (byte)charArray[index];

            return bytesRead;
        }

        public static Encoding GetEncoding(string filePath)
        {
            string fileText = File.ReadAllText(filePath);

            TextReader txtReader = new StringReader(fileText);
            byte[] byteBuff = new byte[fileText.Length];
            int bytesRead = ReadInput(txtReader, byteBuff, 0, byteBuff.Length);

            StreamReader streamReader = new StreamReader(new MemoryStream(byteBuff));
            Encoding enc = Encoding.GetEncoding(streamReader.CurrentEncoding.CodePage);

            txtReader.Close();
            streamReader.Close();
            byteBuff = null;

            return enc;
        }


PM MAIL   Вверх
mr.DUDA
Дата 1.1.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вчера накидал пример, но нашёл что результаты получаются скажем так, "от балды".

Код
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        FileStream stream = File.OpenRead(@"c:\1.txt");
        byte[] content = new byte[stream.Length];
        stream.Read(content, 0, content.Length);

        // добавляем наиболее вероятные предполагаемые кодировки
        List<Encoding> encodings = new List<Encoding>();
        encodings.AddRange(new Encoding[]
        {
            Encoding.GetEncoding("KOI8"), // KOI-8R
            Encoding.ASCII,
            Encoding.UTF8,
            Encoding.GetEncoding(866), // DOS
            Encoding.Unicode,
            Encoding.BigEndianUnicode
        });

        // добавляем все остальные кодировки
        foreach (EncodingInfo encInfo in Encoding.GetEncodings())
            encodings.Add(encInfo.GetEncoding());

        // ищем подходящие кодировки, по первым N символам
        MemoryStream memStream = new MemoryStream(content);
        foreach (Encoding enc in encodings)
        {
            // создаём ридер в этой кодировке
            StreamReader reader = new StreamReader(memStream, enc);

            // определяем кол-во символов букв и цифр
            int numValidChars = 0, totalChars = 0;
            for (int i = 0; i < memStream.Length; i++, totalChars++)
            {
                char ch = (char)reader.Read();
                if(char.IsLetterOrDigit(ch) || char.IsPunctuation(ch))
                    numValidChars++;
            }

            // самое главное - процентное соотношение букв и цифр к остальным символам
            float validCharPercentage = 100f * (float)numValidChars / (float)totalChars;
            if(validCharPercentage > 70f)
                Console.WriteLine("Подходящая кодировка: {0} ({1}%)", enc.EncodingName, validCharPercentage);

            // отматываем к началу потока
            memStream.Position = 0;
        }
    }
}


Нужно таки проверять частоту определённых букв, а не общее количество попавших в "правильный" диапазон.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.