Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Автодетект кодировки


Автор: Softaz 31.12.2006, 19:48
С помощью которых инструментов можно это сделать?

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

Автор: mr.DUDA 31.12.2006, 21:33
http://rsdn.ru/forum/Message.aspx?mid=122862#122862

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

Автор: Stepan_Lameroff 1.1.2007, 13:44
Вот изчо пост с RSDN:
http://rsdn.ru/Forum/?mid=2004951

А вот вариант решения при помощи 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;
        }


Автор: mr.DUDA 1.1.2007, 15:40
Вчера накидал пример, но нашёл что результаты получаются скажем так, "от балды".

Код
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;
        }
    }
}


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)