Автоопределение кодировки (аналог как в Notepad)

maximfreeman

Client
Регистрация
09.03.2018
Сообщения
84
Благодарностей
5
Баллы
8
Хочу добавить функцию как в Notepad в PM
кубик открывает файл текста, автоматически определяет кодировку как в notepad и берет текст в переменную потом добавить кубик с "преобразовать кодировку в utf-8 с BOM".
Можете сделать? А то вручную поднадоедает, под C# не подходит.
У меня разные кодировки то utf-8 то win и т.д
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

maximfreeman

Client
Регистрация
09.03.2018
Сообщения
84
Благодарностей
5
Баллы
8
а что не так с C# ? как бы разрабы на C# и будут писать, если будут конечно.
пытался по хорошему написать на шарпе, выходит не так как положено, как по документации написано у Microsoft, по умолчанию кодировку привествтует, а потом преобразуется в utf-8 с бом, все равно крякозябры выходит. Проверял на 100 файлов из них 47 с крякозябрями а остальные в порядке. Вот как избавиться с различной кодировкой то? Мне бы как в Notepad "Открыл и переобразовал все файлы" и забыл. Но вручную много кликать(
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
пытался по хорошему написать на шарпе, выходит не так как положено, как по документации написано у Microsoft, по умолчанию кодировку привествтует, а потом преобразуется в utf-8 с бом, все равно крякозябры выходит. Проверял на 100 файлов из них 47 с крякозябрями а остальные в порядке. Вот как избавиться с различной кодировкой то? Мне бы как в Notepad "Открыл и переобразовал все файлы" и забыл. Но вручную много кликать(
может код в студию и примеры файлов ?
 

maximfreeman

Client
Регистрация
09.03.2018
Сообщения
84
Благодарностей
5
Баллы
8
может код в студию и примеры файлов ?
Кодировка:
var t = File.ReadAllText(project.Variables["srt_gotov"].Value, Encoding.Default);
File.WriteAllText(@"D:\Cinema\" + project.Variables["kinopoisk_id"].Value + ".srt", t, Encoding.UTF8);
Кодировка субтитров
к примеру 4 файла с разными кодировками utf-8 bom, utf-8, ansi или win-1251
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
а я и не знал какая это глобальная проблема для самостоятельного определения кодировки в файле o_O

48292
 
  • Спасибо
Реакции: Valandersi

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
вот держи наколенное решение. костыль конечно, но пока сделают, да и сделают ли вообще еще тот вопрос.
вот этот код пихаешь в общий код, ниже команд using
C#:
namespace Analizing
{
    public static class EncodingTest
    {
        /// <summary>
        /// UTF8         : EF BB BF      
        /// UTF16 BE    : FE FF          
        /// UTF16 LE    : FF FE
        /// UTF32 BE    : 00 00 FE FF
        /// UTF32 LE    : FF FE 00 00
        /// </summary>
        public static Encoding DetectEncoding(string path)
        {
            FileStream fstream = new FileStream(path, FileMode.OpenOrCreate);
            Encoding result=Encoding.Default;
            if (!fstream.CanSeek || !fstream.CanRead){
                fstream.Close();
                throw new Exception("DetectEncoding() файл не может быть прочитан");
            }
            long Length_File = fstream.Length;
            int Length_Probe_Read = 1000;
            if (Length_Probe_Read >Length_File )Length_Probe_Read = Convert.ToInt32(Length_File);
            Byte[] u8_Buf = new Byte[Length_Probe_Read];
            int s32_Count = fstream.Read(u8_Buf, 0, Length_Probe_Read);
            if (s32_Count >= 2)
            {
                if (u8_Buf[0] == 0xFE && u8_Buf[1] == 0xFF)                {
                    result = new UnicodeEncoding(true, true);
                }
                if (u8_Buf[0] == 0xFF && u8_Buf[1] == 0xFE)                {
                    if (s32_Count >= 4 && u8_Buf[2] == 0 && u8_Buf[3] == 0)                    {
                        result = new UTF32Encoding(false, true);
                    }
                    else                    {
                        result = new UnicodeEncoding(false, true);
                    }
                }
                if (s32_Count >= 3 && u8_Buf[0] == 0xEF && u8_Buf[1] == 0xBB && u8_Buf[2] == 0xBF)                {
                    result = Encoding.UTF8;
                }
                if (s32_Count >= 4 && u8_Buf[0] == 0 && u8_Buf[1] == 0 && u8_Buf[2] == 0xFE && u8_Buf[3] == 0xFF)                {
                    result = new UTF32Encoding(true, true);
                }
                // проверка по коду 0xD0
                    double res= 0.0; double p =  0.0 ;
                    for (int i=0; i<u8_Buf.Length; i++) {
                        if (u8_Buf[i] == 0xD0 ) res++;
                    }
                    p =  res/u8_Buf.Length*100 ;
                    if ( p > 5 ) {                                // при ниличии символа 0xD0 больше чем 5%, можно предположить что кодировка UTF8
                        result = Encoding.UTF8;
                    }
                /////////////////////////////
            }
            fstream.Close();
            return result;
        }      
    }
}
а этот код в кубике используй , как пример , в переменной input имя файла который рядом с проектом лежит. файл считывается в переменную res
ну разберешься я думаю.
C#:
string path = project.Directory + @"\" + project.Variables["input"].Value ; // путь к файлу
Encoding ecn1 =  Analizing.EncodingTest.DetectEncoding(path);                // попытка определить кодировку
project.SendInfoToLog("Определили кодировку как : " + ecn1.ToString());        // вывод кодировки в PM

var t = File.ReadAllText(path, ecn1);                                         // читаем весь файл
project.Variables["res"].Value = t;                                            // ложим в переменную
и файл с тестовым проектом.
если какие файлы будут в кракозябрах , кидай сюда посмотрим что можно подшаманить.
 

Вложения

  • Спасибо
Реакции: maximfreeman

maximfreeman

Client
Регистрация
09.03.2018
Сообщения
84
Благодарностей
5
Баллы
8
вот держи наколенное решение. костыль конечно, но пока сделают, да и сделают ли вообще еще тот вопрос.
вот этот код пихаешь в общий код, ниже команд using
C#:
namespace Analizing
{
    public static class EncodingTest
    {
        /// <summary>
        /// UTF8         : EF BB BF     
        /// UTF16 BE    : FE FF         
        /// UTF16 LE    : FF FE
        /// UTF32 BE    : 00 00 FE FF
        /// UTF32 LE    : FF FE 00 00
        /// </summary>
        public static Encoding DetectEncoding(string path)
        {
            FileStream fstream = new FileStream(path, FileMode.OpenOrCreate);
            Encoding result=Encoding.Default;
            if (!fstream.CanSeek || !fstream.CanRead){
                fstream.Close();
                throw new Exception("DetectEncoding() файл не может быть прочитан");
            }
            long Length_File = fstream.Length;
            int Length_Probe_Read = 1000;
            if (Length_Probe_Read >Length_File )Length_Probe_Read = Convert.ToInt32(Length_File);
            Byte[] u8_Buf = new Byte[Length_Probe_Read];
            int s32_Count = fstream.Read(u8_Buf, 0, Length_Probe_Read);
            if (s32_Count >= 2)
            {
                if (u8_Buf[0] == 0xFE && u8_Buf[1] == 0xFF)                {
                    result = new UnicodeEncoding(true, true);
                }
                if (u8_Buf[0] == 0xFF && u8_Buf[1] == 0xFE)                {
                    if (s32_Count >= 4 && u8_Buf[2] == 0 && u8_Buf[3] == 0)                    {
                        result = new UTF32Encoding(false, true);
                    }
                    else                    {
                        result = new UnicodeEncoding(false, true);
                    }
                }
                if (s32_Count >= 3 && u8_Buf[0] == 0xEF && u8_Buf[1] == 0xBB && u8_Buf[2] == 0xBF)                {
                    result = Encoding.UTF8;
                }
                if (s32_Count >= 4 && u8_Buf[0] == 0 && u8_Buf[1] == 0 && u8_Buf[2] == 0xFE && u8_Buf[3] == 0xFF)                {
                    result = new UTF32Encoding(true, true);
                }
                // проверка по коду 0xD0
                    double res= 0.0; double p =  0.0 ;
                    for (int i=0; i<u8_Buf.Length; i++) {
                        if (u8_Buf[i] == 0xD0 ) res++;
                    }
                    p =  res/u8_Buf.Length*100 ;
                    if ( p > 5 ) {                                // при ниличии символа 0xD0 больше чем 5%, можно предположить что кодировка UTF8
                        result = Encoding.UTF8;
                    }
                /////////////////////////////
            }
            fstream.Close();
            return result;
        }     
    }
}
а этот код в кубике используй , как пример , в переменной input имя файла который рядом с проектом лежит. файл считывается в переменную res
ну разберешься я думаю.
C#:
string path = project.Directory + @"\" + project.Variables["input"].Value ; // путь к файлу
Encoding ecn1 =  Analizing.EncodingTest.DetectEncoding(path);                // попытка определить кодировку
project.SendInfoToLog("Определили кодировку как : " + ecn1.ToString());        // вывод кодировки в PM

var t = File.ReadAllText(path, ecn1);                                         // читаем весь файл
project.Variables["res"].Value = t;                                            // ложим в переменную
и файл с тестовым проектом.
если какие файлы будут в кракозябрах , кидай сюда посмотрим что можно подшаманить.
Спасибо, сейчас протестирую на 1000 файлах.
 

maximfreeman

Client
Регистрация
09.03.2018
Сообщения
84
Благодарностей
5
Баллы
8
вот держи наколенное решение. костыль конечно, но пока сделают, да и сделают ли вообще еще тот вопрос.
вот этот код пихаешь в общий код, ниже команд using
C#:
namespace Analizing
{
    public static class EncodingTest
    {
        /// <summary>
        /// UTF8         : EF BB BF     
        /// UTF16 BE    : FE FF         
        /// UTF16 LE    : FF FE
        /// UTF32 BE    : 00 00 FE FF
        /// UTF32 LE    : FF FE 00 00
        /// </summary>
        public static Encoding DetectEncoding(string path)
        {
            FileStream fstream = new FileStream(path, FileMode.OpenOrCreate);
            Encoding result=Encoding.Default;
            if (!fstream.CanSeek || !fstream.CanRead){
                fstream.Close();
                throw new Exception("DetectEncoding() файл не может быть прочитан");
            }
            long Length_File = fstream.Length;
            int Length_Probe_Read = 1000;
            if (Length_Probe_Read >Length_File )Length_Probe_Read = Convert.ToInt32(Length_File);
            Byte[] u8_Buf = new Byte[Length_Probe_Read];
            int s32_Count = fstream.Read(u8_Buf, 0, Length_Probe_Read);
            if (s32_Count >= 2)
            {
                if (u8_Buf[0] == 0xFE && u8_Buf[1] == 0xFF)                {
                    result = new UnicodeEncoding(true, true);
                }
                if (u8_Buf[0] == 0xFF && u8_Buf[1] == 0xFE)                {
                    if (s32_Count >= 4 && u8_Buf[2] == 0 && u8_Buf[3] == 0)                    {
                        result = new UTF32Encoding(false, true);
                    }
                    else                    {
                        result = new UnicodeEncoding(false, true);
                    }
                }
                if (s32_Count >= 3 && u8_Buf[0] == 0xEF && u8_Buf[1] == 0xBB && u8_Buf[2] == 0xBF)                {
                    result = Encoding.UTF8;
                }
                if (s32_Count >= 4 && u8_Buf[0] == 0 && u8_Buf[1] == 0 && u8_Buf[2] == 0xFE && u8_Buf[3] == 0xFF)                {
                    result = new UTF32Encoding(true, true);
                }
                // проверка по коду 0xD0
                    double res= 0.0; double p =  0.0 ;
                    for (int i=0; i<u8_Buf.Length; i++) {
                        if (u8_Buf[i] == 0xD0 ) res++;
                    }
                    p =  res/u8_Buf.Length*100 ;
                    if ( p > 5 ) {                                // при ниличии символа 0xD0 больше чем 5%, можно предположить что кодировка UTF8
                        result = Encoding.UTF8;
                    }
                /////////////////////////////
            }
            fstream.Close();
            return result;
        }     
    }
}
а этот код в кубике используй , как пример , в переменной input имя файла который рядом с проектом лежит. файл считывается в переменную res
ну разберешься я думаю.
C#:
string path = project.Directory + @"\" + project.Variables["input"].Value ; // путь к файлу
Encoding ecn1 =  Analizing.EncodingTest.DetectEncoding(path);                // попытка определить кодировку
project.SendInfoToLog("Определили кодировку как : " + ecn1.ToString());        // вывод кодировки в PM

var t = File.ReadAllText(path, ecn1);                                         // читаем весь файл
project.Variables["res"].Value = t;                                            // ложим в переменную
и файл с тестовым проектом.
если какие файлы будут в кракозябрах , кидай сюда посмотрим что можно подшаманить.
збс помогло.
 

ulLite

Client
Регистрация
24.03.2019
Сообщения
75
Благодарностей
23
Баллы
8
А у меня не получается с кодировкой. у меня формат php. Мне нужно его будет открыть в кубике список,чтобы потом делать операцию над списком,но не срабатывает. И с кодом не могу разобраться. Вроде верно делаю
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
А у меня не получается с кодировкой. у меня формат php. Мне нужно его будет открыть в кубике список,чтобы потом делать операцию над списком,но не срабатывает. И с кодом не могу разобраться. Вроде верно делаю
48999
49000
 

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 085
Благодарностей
29
Баллы
48
вот держи наколенное решение. костыль конечно, но пока сделают, да и сделают ли вообще еще тот вопрос.
вот этот код пихаешь в общий код, ниже команд using
C#:
namespace Analizing
{
    public static class EncodingTest
    {
        /// <summary>
        /// UTF8         : EF BB BF     
        /// UTF16 BE    : FE FF         
        /// UTF16 LE    : FF FE
        /// UTF32 BE    : 00 00 FE FF
        /// UTF32 LE    : FF FE 00 00
        /// </summary>
        public static Encoding DetectEncoding(string path)
        {
            FileStream fstream = new FileStream(path, FileMode.OpenOrCreate);
            Encoding result=Encoding.Default;
            if (!fstream.CanSeek || !fstream.CanRead){
                fstream.Close();
                throw new Exception("DetectEncoding() файл не может быть прочитан");
            }
            long Length_File = fstream.Length;
            int Length_Probe_Read = 1000;
            if (Length_Probe_Read >Length_File )Length_Probe_Read = Convert.ToInt32(Length_File);
            Byte[] u8_Buf = new Byte[Length_Probe_Read];
            int s32_Count = fstream.Read(u8_Buf, 0, Length_Probe_Read);
            if (s32_Count >= 2)
            {
                if (u8_Buf[0] == 0xFE && u8_Buf[1] == 0xFF)                {
                    result = new UnicodeEncoding(true, true);
                }
                if (u8_Buf[0] == 0xFF && u8_Buf[1] == 0xFE)                {
                    if (s32_Count >= 4 && u8_Buf[2] == 0 && u8_Buf[3] == 0)                    {
                        result = new UTF32Encoding(false, true);
                    }
                    else                    {
                        result = new UnicodeEncoding(false, true);
                    }
                }
                if (s32_Count >= 3 && u8_Buf[0] == 0xEF && u8_Buf[1] == 0xBB && u8_Buf[2] == 0xBF)                {
                    result = Encoding.UTF8;
                }
                if (s32_Count >= 4 && u8_Buf[0] == 0 && u8_Buf[1] == 0 && u8_Buf[2] == 0xFE && u8_Buf[3] == 0xFF)                {
                    result = new UTF32Encoding(true, true);
                }
                // проверка по коду 0xD0
                    double res= 0.0; double p =  0.0 ;
                    for (int i=0; i<u8_Buf.Length; i++) {
                        if (u8_Buf[i] == 0xD0 ) res++;
                    }
                    p =  res/u8_Buf.Length*100 ;
                    if ( p > 5 ) {                                // при ниличии символа 0xD0 больше чем 5%, можно предположить что кодировка UTF8
                        result = Encoding.UTF8;
                    }
                /////////////////////////////
            }
            fstream.Close();
            return result;
        }     
    }
}
а этот код в кубике используй , как пример , в переменной input имя файла который рядом с проектом лежит. файл считывается в переменную res
ну разберешься я думаю.
C#:
string path = project.Directory + @"\" + project.Variables["input"].Value ; // путь к файлу
Encoding ecn1 =  Analizing.EncodingTest.DetectEncoding(path);                // попытка определить кодировку
project.SendInfoToLog("Определили кодировку как : " + ecn1.ToString());        // вывод кодировки в PM

var t = File.ReadAllText(path, ecn1);                                         // читаем весь файл
project.Variables["res"].Value = t;                                            // ложим в переменную
и файл с тестовым проектом.
если какие файлы будут в кракозябрах , кидай сюда посмотрим что можно подшаманить.
Добрый день, а что делать если у меня в Exel всякая фигня записана, подскажите. К сожелению файл не загружается вот ссылка на облоко https://cloud.mail.ru/public/ubMr/2TPJqnWiw
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
попробуйте каждую ячейку считать как текст и прогнать через этот код, результат загнать обратно в ячейку. в общий код функцию DetectEncoding надо естественно поместить
C#:
string ans = "Бриттонс Хилл";
Encoding ecn1 = Encoding.Default;     // исходная кодировка
var bytes = ecn1.GetBytes(ans);     // байты из кодировки
var toEncoding = Encoding.UTF8;     // желаемая кодировка
ans = toEncoding.GetString(bytes);    // получение строки в желаемой кодировке
return ans;
54287


хотя не... чот я и сам подзабыл, эта функция же с файлом работает. хотя у меня норм конвертнуло :-)
а можно не заморачиваться, тупо кракозябры перегнать из дефалтной кодировки в UTF8 :-) поправил малясь код
 
Последнее редактирование:
  • Спасибо
Реакции: orka13

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 085
Благодарностей
29
Баллы
48
Спасибо, выручил
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)