Как выводить русский текст в консоли из пакетного файла

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,813
Реакции
6,592
Вывод русского текста в консоль из пакетного файла .bat, .cmd
представляет иногда трудность.

Почему же так?

Оболочка CMD.exe работает по-умолчанию в кодировке DOS (OEM-866)
Блокнот Windows создает файл в кодировке WIN-1251

Как понимаете, получим крякозябры.
Выход: использовать специальный редактор, который сохраняет батник в кодировке CP-866.

Из наиболее популярных:

AkelPad

Скачать редактор с официального сайта.
Скачать версию с плагинами и подсветкой.
Скачать уже настроенную с плагинами и подсветкой.

Akel_Default.png
Akel_mod.png


Сам пользуюсь вот такой модификацией выше, что и Вам советую
(в конце поста настроенный мною редактор - шрифт, тема, плагины).

Скачать с OSZone. Нужна дополнительная сборка.
Скачать уже собранную и настроенную мною (шрифт, тема, плагины). Cм. в конце этого поста.

Запуск из папки "MyAkelPad".
Если папку с редактором скопируете в Program Files,
не забудьте дать ей полные права (в комплекте есть батник FA.cmd - запустить "от имени Администратора" из папки с редактором).

Чтобы создать новый файл в кодировке DOS:
Меню "Файл" -> "Сохранить как..." -> из выпадающего списка выбрать "Кодировка OEM-866".
Файл должен иметь расширение bat или cmd.

Для себя я настроил AkelPad так, чтобы он всегда сохранял в кодировке OEM-866 (Настройки -> Параметры -> Кодировка по-умолчанию -> OEM-866.)


Чтобы правильно сконвертировать уже имеющийся в редакторе код с кириллицей:
Войти в редактор.
1) Ctrl+A, скопировать код.
2) Удалить код.
3) Меню "Кодировки" -> выбрать "Сохранить в DOS-866".
4) Вставить код.
5) Сохранить, запустить.

Полезные горячие комбинации клавиш:
Запуск скрипта (Ctrl + F5)
На весь экран (F11)
Сохранить (Ctrl + S)
Открыть в кодировке WIN (Alt + W)
Открыть в кодировке DOS (Alt + D)



Notepad++

Скачать редактор с официального сайта.
Обсуждение редактора на форуме.

Notepad++.PNG

Чтобы создать новый файл в кодировке DOS:
Меню "Кодировки" -> "Кодировки" -> "Кириллица" -> "OEM-866"
"Файл" -> "Сохранить как..." -> пишем имя файла и расширение bat или cmd -> Сохранить.

Чтобы правильно сконвертировать уже имеющийся в редакторе код с кириллицей:
Войти в редактор.
1) Ctrl+A, скопировать код.
2) Удалить код.
3) Меню "Кодировки" -> "Кодировки" -> "Кириллица" -> "OEM-866"
4) Вставить код.
5) Сохранить, запустить.


Помните: в редакторе не должно быть видно "крякозябер", иначе это значит: Вы неправильно скопировали код (или открыли в представлении другой кодировки - меню "Вид").
В Windows Vista, 7 часто бывает, что код с форума "портиться" в буфере.
Выход: когда копируете код, убедитесь, что включена русская раскладка клавиш, или воспользуйтесь этим твиком # 2.
 

Вложения

  • MyAkelPad.zip
    4 MB · Просмотры: 115
Есть и такая вещь.
http://www.rusf.ru/books/yo/xcode.html
PHP:
xcode +a -w help.txt help0.txt
‚맮ў: xcode -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] [in [out]]
-E -h in English (don't forget to add -h or -H switch!)
-v Ёд®а¬ жЁп ® ўҐабЁЁ
-H Џ®« п бЇа ўЄ , бЇЁб®Є 14 Ї®¤¤Ґа¦Ёў Ґ¬ле Є®¤Ёа®ў®Є Ё «ЁжҐ§Ёп р-ware
-d ¤ў®© п ЇҐаҐЄ®¤Ёа®ўЄ (Їа®Ўг©вҐ, Ґб«Ё Їа®бв® Є®¬ ¤ 'xcode' Ґ ба Ў®в « )
-q ¤ҐЄ®¤Ёа®ў ЁҐ "quoted-pritable" бЁ¬ў®«®ў, ЁбЇ®«м§гҐ¬ле ў MIME
-l ¤ҐЄ®¤Ёа®ў ЁҐ html-“ЁЄ®¤ ⥪бв [ўа®¤Ґ Дима]
-c ®ЇаҐ¤Ґ«Ёвм Є®¤Ёа®ўЄг Ё ўл¤ вм Ґс ў ўл室®© д ©« (Ї®¤а®Ў п бЇа ўЄ Ї® -H)
-t Їа®Ё§ўҐбвЁ unix2dos ЇаҐ®Ўа §®ў ЁҐ (ЇаҐўа вЁвм LF ў CR/LF) ў DOS/WIN
-p ०Ё¬ вагЎл (вॡгҐвбп в®«мЄ® ў DOS/Win ®Єа㦥ЁЁ)
-s ०Ё¬ silent --- Ґ ўлў®¤Ёвм Ёд®а¬ жЁо ® Є®¤Ёа®ўЄ е
…б«Ё ўе®¤®©/ўл室®© д ©« Ґ гЄ § , ЁбЇ®«м§гҐвбп бв ¤ авл© ўў®¤/ўлў®¤.
-a ўлў®¤Ё¬ ў Є®¤Ёа®ўЄҐ cp866 (Ї® 㬮«з Ёо)
-w ўлў®¤Ё¬ ў Є®¤Ёа®ўЄҐ cp1251
-k ўлў®¤Ё¬ ў Є®¤Ёа®ўЄҐ koi8-r
-i ўлў®¤Ё¬ ў Є®¤Ёа®ўЄҐ iso8859-5
-m ўлў®¤Ё¬ ў Є®¤Ёа®ўЄҐ mac
+a ўе®¤Ґ Є®¤Ёа®ўЄ cp866
+w ўе®¤Ґ Є®¤Ёа®ўЄ cp1251
+k ўе®¤Ґ Є®¤Ёа®ўЄ koi8-r
+i ўе®¤Ґ Є®¤Ёа®ўЄ iso8859-5
+m ўе®¤Ґ Є®¤Ёа®ўЄ mac
Вызов: xcode -E -[hH?] -[wkaim1234567890] +[wkaim1234567890] [-q] [in [out]]
-E -h in English (don't forget to add -h or -H switch!)
-v информация о версии
-H Полная справка, список 14 поддерживаемых кодировок и лицензия Ё-ware
-d двойная перекодировка (пробуйте, если просто команда 'xcode' не сработала)
-q декодирование "quoted-pritable" символов, используемых в MIME
-l декодирование html-Уникод текста [вроде Дима]
-c определить кодировку и выдать её в выходной файл (подробная справка по -H)
-t произвести unix2dos преобразование (превратить LF в CR/LF) в DOS/WIN
-p режим трубы (требуется только в DOS/Win окружении)
-s режим silent --- не выводить информацию о кодировках
Если входной/выходной файл не указан, используется стандартный ввод/вывод.
-a выводим в кодировке cp866 (по умолчанию)
-w выводим в кодировке cp1251
-k выводим в кодировке koi8-r
-i выводим в кодировке iso8859-5
-m выводим в кодировке mac
+a на входе кодировка cp866
+w на входе кодировка cp1251
+k на входе кодировка koi8-r
+i на входе кодировка iso8859-5
+m на входе кодировка mac
 
Последнее редактирование:
Перекодировка текста

  • Внешними утилитами
win_iconv
любая кодировка <-> любая кодировка

Автор: Yukihiro Nakadaira
Версия: 0.0.6 (от 22.11.2012)
Это утилита с открытым исходным кодом.

Скачать утилиту: 1. Оф. сайт. 2. Зеркало (safezone).

Синтаксис:
iconv [-c] [-s] [-f encoding] [-t encoding] [inputfile …]

Получить перечень названий кодировок:
CMD/BATCH:
iconv -L | sort
Примеры использования:
Юникод -> OEM-866
CMD/BATCH:
win_iconv -f UTF-16LE -t cp866 "UTFtext.txt" > "DOStext.txt"
Win-1251 -> OEM-866
CMD/BATCH:
win_iconv -f WINDOWS-1251 -t cp866 "WINtext.txt" > "DOStext.txt"
VBA (на Excel-e) :) + таблица символов.
1. OEM-866 <-> Win-1251
2. -> Unicode.
Автор: Dragokas
Написан на VBA (Excel). Скачать.

Для работы необходимо включить макросы:
Для Office = 2003: Сервис -> Макрос -> Безопасность -> Выставить "Средний" или "Низкий".
Для Office > 2003 MSDN

Описание функций:
  • Перекодировка:
    - в Unicode.
    - Из OEM-866 -> в Win-1251
    - Из Win-1251 -> в OEM-866.
  • Таблица символов с их 10-ричным и 16-ым представлениями:
    - 1-байтовая;
    - 2-байтовая.
to1251.exe (Assembler)
OEM-866 -> WIN-1251
Скачать.
Самый быстрый перекодировщик. Написан на ассемблере =)

Автор: Charles Kludge

Пример использования:
Перекодировать вывод команды ipconfig и записать результат в файл result.txt
CMD/BATCH:
ipconfig /all | to1251.exe > result.txt
Перекодировать файл file1.txt и записать результат в файл result.txt
CMD/BATCH:
to1251.exe < file1.txt > result.txt

Код:
format PE console 4.0
include 'win32a.inc'
next:  invoke  crt_getchar
  push  eax
  invoke  GetLastError
  or  eax, eax
  jnz exit
  pop eax
  call  recode
  invoke  crt_putchar, eax
  jmp next
exit:
  invoke  ExitProcess,0
recode:
  cmp eax,080h  ; rus cap 'A'
  jb  @5
  cmp eax,0afh  ; rus small 'п'
  ja  @1
  or  al,40h
@5: ret
@1:
  cmp al,0e0h  ; rus small 'р'
  jae @4
  mov al,20h  ; pseudoghaphic chrs 0xb0-0xdf -> <space>
  ret
@4: cmp al, 0efh  ; rus small 'я'
  ja  @3
  add al,10h
  ret
@3:  and ax, 0fh
  mov ebx, xlt
  xlatb
@2:
  ret
xlt db  0a8h, 0b8h, 0aah, 0bah, 0afh, 0bfh, 0a1h, 0a2h, 0b0h, 95h, 0b7h,20h,0b0h,0a4h,20h,20h
; import data in the same section
data import
library kernel32,'KERNEL32.DLL',\
  msvcrt,'MSVCRT.DLL'
import kernel32,\
  ExitProcess,'ExitProcess',\
  GetLastError,'GetLastError'
import msvcrt,\
  crt_getchar,'getchar',\
  crt_putchar, 'putchar'
end data
  • Родными средствами Windows.
CMD.
866 -> в Юникод
Записать текст во внешний файл в кодировке Юникод:

CMD/BATCH:
cmd /U /C echo Всё ГУД>"myfile.txt"
Батник должен быть в кодировке 866.

Перекодировка файла с OEM-866 -> в Юникод:

CMD/BATCH:
cmd /U /C type "myfile_866.txt" > "myfile_Unicode.txt"

Вариант с соблюдением всех стандартов юникода UTF-16
и возможностью указать исходную кодовую страницу:

Использование:

CMD/BATCH:
Batch.cmd infile outfile src_codepage

где:

Batch.cmd - сам Batch-файл
infile - файл для перекодировки
outfile - выходной файл
src_codepage - необязательный параметр. Номер кодовой страницы исходного файла.

2 варианта кода
(смотря в какой кодировке будет батник):

1) Исходник кода сохранить в кодировке WIN-1251:
CMD/BATCH:
@echo off
:: преобразование текстового файла в unicode (utf-16 LE)
:: вызов: to_uni infile outfile codepage
:: BAT-файл должен быть сохранен в кодировке WIN-1251
SetLocal EnableExtensions
For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G
chcp 1251 >nul
CMD.EXE /D /A /C (set /p=яю)<NUL > "%~2"
CHCP %~3 >NUL
CMD.EXE /D /U /C TYPE "%~1" >> "%~2"
CHCP %_codepage% >NUL

2) исходник кода сохранить в кодировке OEM-866:
CMD/BATCH:
@echo off
:: преобразование текстового файла в unicode (utf-16 LE)
:: вызов: to_uni infile outfile codepage
:: BAT-файл должен быть сохранен в кодировке OEM-866
SetLocal EnableExtensions
For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G
chcp 866 >nul
for /F %%? in ('echo яю') do chcp 1251 >nul& CMD.EXE /D /A /C (set /p=яю)<NUL > "%~2"
CHCP %~3 >NUL
CMD.EXE /D /U /C TYPE "%~1" >> "%~2"
CHCP %_codepage% >NUL
CMD
OEM-866 -> WIN-1251
CMD/BATCH:
@echo off
SetLocal
::Файл с кодировкой OEM-866
set FileIn=text.txt
::Результат, куда записывать WIN-1251
set FileOut=text.txt

chcp 866> nul
for /f "delims=" %%a in (%FileIn%) do (
  if not defined cpReady (
  chcp 1251> nul
  set CpReady=True
  )
  call :convert "%%a"  2>NUL
)
chcp 866> nul
goto :eof

:convert
echo.%~1>>"%FileOut%"
VBScript + CMD
Win-1251 <-> OEM-866
Результат сохраняется в исходный файл.

Вызывающий CMD:
OEM-866 -> Win-1251
CMD/BATCH:
cscript.exe //nologo Recode.vbs "cp866" "windows-1251" "имя_файла"

Win-1251 -> OEM-866
CMD/BATCH:
cscript.exe //nologo Recode.vbs "windows-1251" "cp866" "имя_файла"

Вызываемый Recode.vbs (положить рядом с батником):

VB.NET / VBA:
On Error Resume Next
FullName = WScript.Arguments(2)

With CreateObject("ADODB.Stream")
  .Type = 2
  .Charset = WScript.Arguments(0)
  .Open
  .LoadFromFile FullName
  Text = .ReadText()
  .Close
  .Charset = WScript.Arguments(1)
  .Open
  .WriteText (Text)
  .SaveToFile FullName, 2
  .Close
End with

Посмотреть вложение win-iconv-0.0.6-bin.zip
Посмотреть вложение FromUnicode (конвертор)2.zip
Посмотреть вложение to1251.zip
 
Последнее редактирование:
Назад
Сверху Снизу