Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22

Из батника определить кодировку txt файла

13.05.2020, 01:25. Показов 7105. Ответов 29

Студворк — интернет-сервис помощи студентам
есть файлы

1.txt
2.txt
3.txt
4.txt
5.txt

нужно из батника (cmd) узнать какая кодировка у каждого файла.

возможные варианты кодировок:
("ansi", "utf8", "unicode")

идеально получить значение в переменную.

можна юзать стандартные команды виндовс (cmd) и PS

Windows Batch file
1
2
3
4
5
6
FOR /L %%I IN (1,1,5) DO (
ECHO узнать кодировку "%%I.txt"
set /p codePage= КОДИРОВКА < "%%I.txt"
start programm.exe -x 1 -y "%%I.txt" -z %codePage% -OUTPUT
move OUTPUT OUTPUT_%codePage%
)
где-то так...
но понять как можна получить кодировку ДРУГОГО файла а не поточного батника -найти не смог (((

Добавлено через 29 минут
незнаю на чем ЭТО,
но может как-то можна "сварганить" что-то подобное на баш/пш ???


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static class StreamExtension
{
    /// <summary>
    /// Convert the content to a string.
    /// </summary>
    /// <param name="stream">The stream.</param>
    /// <returns></returns>
    public static string ReadAsString(this Stream stream)
    {
        var startPosition = stream.Position;
        try
        {
            // 1. Check for a BOM
            // 2. or try with UTF-8. The most (86.3%) used encoding. Visit: http://w3techs.com/technologies/overview/character_encoding/all/
            var streamReader = new StreamReader(stream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true), detectEncodingFromByteOrderMarks: true);
            return streamReader.ReadToEnd();
        }
        catch (DecoderFallbackException ex)
        {
            stream.Position = startPosition;
 
            // 3. The second most (6.7%) used encoding is ISO-8859-1. So use Windows-1252 (0.9%, also know as ANSI), which is a superset of ISO-8859-1.
            var streamReader = new StreamReader(stream, Encoding.GetEncoding(1252));
            return streamReader.ReadToEnd();
        }
    }
}
Добавлено через 11 минут
нашел еще на просторах стекОверфлов,
но непонятно будет ли кирилицу хавать....

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@echo off
setlocal EnableExtensions DisableDelayedExpansion
 
rem // Define constants here:
set "_FILE=%~1" & rem // (provide file via the first command line argument)
 
rem // Check whether a dedicated file is given (so no wild-cards):
2> nul >&2 (< "%_FILE%" set /P ="" & ver) || (
    rem // The file does not exist:
    >&2 echo The file could not be found, hence there is no encoding!
    exit /B 255
)
 
rem // Determine the file size:
set "SIZE=" & for %%F in ("%_FILE%") do set "SIZE=%%~zF"
if not defined SIZE (
    rem // The file does not exist:
    >&2 echo The file could not be found, hence there is no encoding!
    exit /B 255
)
if %SIZE% EQU 0 (
    rem // The file is empty:
    >&2 echo The file is empty, hence encoding cannot be determined!
    exit /B 1
)
 
rem // Store current code page to be able to restore it finally:
for /F "tokens=2 delims=:" %%C in ('chcp') do set /A "$CP=%%C"
rem /* Change to code page 437 (original IBM PC or DOS code page) temporarily;
rem    this is necessary for extended characters not to be converted: */
> nul chcp 437
 
rem // Attempt to read first line from file; this fails if zero-bytes occur:
(
    rem /* The loop does not iterate over an empty file or one with empty lines only;
    rem    therefore, the behaviour is the same as when zero-bytes occur: */
    for /F usebackq^ delims^=^ eol^= %%L in ("%_FILE%") do (
        rem // Abort reading file after first non-empty line:
        goto :NEXT
    )
) || (
    rem /* The `for /F` loop returns a non-zero exit code in case the file is empty,
    rem    contains empty lines only or the first non-empty line contains zero-bytes;
    rem    to determine whether there are zero-bytes, let `find` process the file,
    rem    which removes zero-bytes or converts them to line-breaks, so `for /F` can
    rem    read the file;
    rem    however, `find` would read the whole file, hence do that only for small
    rem    ones and skip that for large ones, such contains zero-bytes most likely: */
    if %SIZE% LEQ 8192 (
        (
            rem // In case the file contains line-breaks only, the loop does not iterate:
            for /F delims^=^ eol^= %%L in ('^< "%_FILE%" find /V ""') do (
                rem // Abort reading file after first non-empty line:
                goto :ZERO
            )
        ) || (
            rem /* The loop did not iterate, so the file contains line-breaks only;
            rem    restore the initial code page prior to termination: */
            > nul chcp %$CP%
            >&2 echo The file holds only empty lines, hence encoding cannot be determined!
            exit /B 1
        )
    )
)
 
rem // This point is reached in case the file contains zero-bytes:
:ZERO
rem // Restore the initial code page prior to termination:
> nul chcp %$CP%
>&2 echo NULL-bytes detected in first line, so file is non-ASCII/ANSI!
exit /B 2
 
rem // This point is reached in case the file does not contain any zero-bytes:
:NEXT
rem /* Build Byte Order Marks (BOMs) for UTF-16-encoded text (Little Endian and Big Endian)
rem    and for UTF-8-encoded text: */
for /F "tokens=1-3" %%A in ('
    forfiles /P "%~dp0." /M "%~nx0" /C "cmd /C echo 0xFF0xFE 0xFE0xFF 0xEF0xBB0xBF"
') do set "$LE=%%A" & set "$BE=%%B" & set "$U8=%%C"
 
rem /* Reset line string variable, then store first line string (1023 bytes at most);
rem    in contrast to `for /F`, this does not skip over blank lines: */
< "%_FILE%" (set "LINE=" & set /P LINE="")
rem // Check whether the first line of the file begins with any of the BOMs:
if not "%LINE:~,2%"=="%$LE%" if not "%LINE:~,2%"=="%$BE%" if not "%LINE:~,3%"=="%$U8%" goto :CONT
rem /* One of the BOMs has been encountered, hence the file is Unicode-encoded;
rem    restore the initial code page prior to termination: */
> nul chcp %$CP%
>&2 echo BOM encountered in first line, so file is non-ASCII/ANSI!
exit /B 4
 
rem // This point is reached in case the file does not appear as Unicode-encoded:
:CONT
rem // Restore the initial code page prior to termination:
> nul chcp %$CP%
echo The file appears to be an ASCII-/ANSI-encoded text.
 
endlocal
exit /B 0
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2020, 01:25
Ответы с готовыми решениями:

Установить кодировку создаваемого txt файла в ANSI
Доброго времени суток! Есть код, который парсит определенную страницу в инете а после создает файл txt с результатом. Может кто знает как...

Как можно изменить кодировку .txt файла перед его сохранением?
Как можно изменить кодировку .txt файла перед его сохранением? Например, есть a:textfile, я все как надо расписал и закрыл его. Можно ли...

Не получается подобрать кодировку батника в Windows XP
Всем желаю добрых суток! Написал батник для определения кем и когда была установлена ОС. Работает батник правильно в ОС 10. Вот этот...

29
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
13.05.2020, 04:52
Лучший ответ Сообщение было отмечено velmyshanovnyi как решение

Решение

Студворк — интернет-сервис помощи студентам
Да, действительно вылетает. Ладно, сейчас разберёмся

Добавлено через 2 минуты
Пробуйте:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
setlocal EnableDelayedExpansion
@echo off
@chcp
@chcp 65001
@chcp 65001 > nul
 
@ECHO # создаем семпл файлов       >detect.log
@ECHO # 
chcp 65001
chcp 65001 > nul
ECHO 1 utf-8 >1.txt
chcp 866
chcp 866 > nul
ECHO 2 866   >2.txt
chcp 1251
chcp 1251 > nul
ECHO 3 1251  >3.txt
 
 
@chcp 65001
@chcp 65001 > nul
 
@ECHO # 1 utf-8                    >>detect.log
@ECHO # 2 cp866                    >>detect.log
@ECHO # 3 windows-1251             >>detect.log
@ECHO # 
 
FOR /L %%I IN (1,1,3) DO (
    @ECHO # узнать кодировку "%%I.txt" >>detect.log
    for /f "tokens=2 delims=:" %%a in ('enca.exe -i -p -L russian "%%I.txt"') do (
        set "codePage=%%a"
        set codePage=!codePage: =!
        @ECHO # programm.exe -x 1 -y "%%I.txt" -z !codePage! -OUTPUT >>detect.log
        @ECHO # move "OUTPUT" "OUTPUT_!codePage!"                    >>detect.log
    )
)
cmd -k
1
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22
13.05.2020, 05:08  [ТС]
....
Из батника определить кодировку txt файла

Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
for /f "tokens=* delims=" %%a in ('dir /a-d/b/s "C:\test\*.txt"') do (
    call :step_1 "%%a"
)
pause
exit
:step_1
enca -e -p -L ru %1
exit /b

воспользававшить ЭТОЙ версией просмотрел ГЛАЗАМИ лог 25.000+ файлов,
отловил 8 файлов
исправил руками....

пока что это вышло наиболее быстро...


автоматизоловать пока не вышло ((
возможно позже получится....
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
13.05.2020, 05:13
Ничего не понял из сказанного Вами :-) У Вас есть большое количество файлов и у каждого нужно узнать кодировку? Опишите подробно весь процесс того, что Вы хотите аатоматизировать
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22
13.05.2020, 05:24  [ТС]
немного поправил - чтоб лог был красивее ))


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
setlocal EnableDelayedExpansion
@echo off
@chcp
@chcp 65001
@chcp 65001 > nul
 
@ECHO # создаем семпл файлов       >detect.log
@ECHO # 
chcp 65001
chcp 65001 > nul
ECHO 1 utf-8 >1.txt
chcp 866
chcp 866 > nul
ECHO 2 866   >2.txt
chcp 1251
chcp 1251 > nul
ECHO 3 1251  >3.txt
 
 
@chcp 65001
@chcp 65001 > nul
 
@ECHO # 1 utf-8                    >>detect.log
@ECHO # 2 cp866                    >>detect.log
@ECHO # 3 windows-1251             >>detect.log
@ECHO # 
 
FOR /L %%I IN (1,1,3) DO (
    @ECHO # узнать кодировку "%%I.txt" >>detect.log
    for /f "tokens=2 delims=:" %%a in ('enca.exe -i -p -L russian "%%I.txt"') do (
        set "codePage=%%a"
        set codePage=!codePage: =!
        @ECHO #
        @ECHO # "%%I.txt" codePage=!codePage!                        >>detect.log
        @ECHO # programm.exe -x 1 -y "%%I.txt" -z !codePage! -OUTPUT
        @ECHO # move "OUTPUT" "OUTPUT_!codePage!"
    )
)
cmd -k
лог:

# создаем семпл файлов
# 1 utf-8
# 2 cp866
# 3 windows-1251
# узнать кодировку "1.txt"
# "1.txt" codePage=ASCII
# узнать кодировку "2.txt"
# "2.txt" codePage=ASCII
# узнать кодировку "3.txt"
# "3.txt" codePage=ASCII



Добавлено через 3 минуты
Ничего не понял из сказанного Вами :-) У Вас есть большое количество файлов и у каждого нужно узнать кодировку? Опишите подробно весь процесс того, что Вы хотите аатоматизировать
да, из .тхт файла я генерирую аудиокнигу,
но нужно знать в какой кодировке каждый файл (перед генерацией)

я думал передавать параметр кодировки каждого файла сразу в программу....
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
13.05.2020, 05:26
И в чем проблема? Enca неправильно кодировку определяет?
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22
13.05.2020, 05:45  [ТС]
И в чем проблема? Enca неправильно кодировку определяет?
правильно,
спасибо Вам за идею!

теперь такой озвучки как в начале этого файла - не будет )))
https://www.youtube.com/watch?... S&index=13

уже не будет звучится на неправильной кодировке
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
13.05.2020, 05:47
Ну хорошо, на здоровье :-)
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22
13.05.2020, 05:56  [ТС]
последняя версия файла
0
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 22
13.05.2020, 05:57  [ТС]
только сам скрипт (без .exe)
Вложения
Тип файла: rar detect.rar (533 байт, 3 просмотров)
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
13.05.2020, 14:57
По последним данным разведки главнее питона зверя нет.
Дело дошло даже до того, что он присутствует в Microsoft Store

https://www.microsoft.com/en-u... verviewtab

Для рассматриваемой темы у Python имеется модуль chardet
( пол-миллиарда закачек )


Распознает след. кодировки:
Code
1
2
3
4
5
6
7
8
9
10
11
ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
EUC-KR, ISO-2022-KR (Korean)
KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
ISO-8859-2, windows-1250 (Hungarian)
ISO-8859-5, windows-1251 (Bulgarian)
windows-1252 (English)
ISO-8859-7, windows-1253 (Greek)
ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
TIS-620 (Thai)
Как установить:
Проще всего с оф. сайта Python.org

После установки Python надо установить сам модуль chardet
Windows Batch file
1
pip install chardet
с модулем chardet приходит готовая к употреблению утилита chardetect
Windows Batch file
1
chardetect file.txt file2.txt  sometext.txt
кроме этого можно организовать проверку самостоятельно,
используя средства языка:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import glob
import chardet.universaldetector
 
detector = chardet.UniversalDetector()
 
for filename in glob.glob('*.txt'):
    print(filename + ' : ', end='')
    detector.reset()
    with open(filename, 'rb') as file:
        for line in file:
            detector.feed(line)
            if detector.done: break
    detector.close()
    print( detector.result['encoding'] )
( проверка всех файлов *.txt в тек. каталоге )

Назвав этот скрипт detector.py, он запускается:
Windows Batch file
1
python detector.py
Будет ли chardet определять лучше, чем Enca, покажет практика.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2020, 14:57

Определить кодировку файла
Подскажите, что это за формат кодировки файла и можно ли его преобразовать с помощью iconv? Файл:

Как определить кодировку файла?
Допустим, программа будет обрабатывать некий текстовый файл с зарание неизвестной кодировкой. Как можно на С++ программно правильно...

Определить кодировку файла ANSI/UTF-8
Знаю что можно кодировку UTF-8 с BOM можно определить по первым трем байтам в файле - EF BB BF, но как быть с UTF-8 без BOM ?

Как определить кодировку bat-файла?
а как проверить кодировку batфайла с помощью другого batника и если скажем совпадает то продолжить дальше(If Exist )... Через один Bat...

Определить кодировку файла (UTF8 без BOM)
Мужики, всем привет! Может кто занимался подобным, подскажите, как можно определить кодировку файла? Какие есть варианты? Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru