вторник, 9 августа 2016 г.

Русский текст в консоли Windows

В очередной раз матерясь на несуразную работу Windows с кодировками, нашёл этот текст, объясняющий и в какой-то мере решающий эту проблему.


Написав в блокноте Windows (Notepad.exe) батник 1.bat такого содержания

@Echo off
Echo Введите текст. Завершение ввода - комбинация Ctrl+Z {ENTER}
copy con temp.txt
 мы получим "абракадабру":

Почему так происходит?
Консоль работает в кодировке DOS (codepage 866).
Блокнот Windows создает пакетный файл в кодировке WIN (codepage 1251).

Поэтому, когда Вы запускаете файл, консоль отображает его в своей (DOS) кодировке.

Решение (3 способа):

1 способ (сохранение файла в кодировке OEM-866):
Скачаем текстовый редактор, поддерживающий сохранение текста в кодировке OEM-866 (DOS):
AkelPad
Notepad++

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

2 способ (смена кодовой страницы):
Сменить кодовую страницу консоли.

А именно, в начале пакетного файла написать:
 chcp 1251 >nul
Это поможет Вам только частично.
Что можно?
md "Моя папка"
 Создаст папку "Моя папка" с нормальными символами.

Что нельзя:
Echo Мой текст
Все равно выведет текст "абракодаброй".
Кроме того, текст сообщений от команд консоли тоже станет нечитаемым.

Но русский текст все равно можно вывести таким трюком:

2а)
chcp 1251 >nul
for /f "delims=" %%A in ("Мой текст") do >nul chcp 866& echo.%%A
2б)
 chcp 1251 >NUL
set x=Русский текст
chcp 866 >NUL
echo %x%
pause 
3 способ (для ленивых):
(или для тех, кто не может установить себе продвинутый редактор по религиозным или др. причинам :) )
Конвертируем Batch-файл правым кликом мыши ^_^

Пример для Windows 7:
1) Пуск -> в поисковой строке набрать Shell:SendTo
2) Откроется папка, в которую нужно скопировать RecodeToDOS.vbs

Использование:
Правый клик мыши по Batch-файлу -> Отправить -> RecodeToDOS
Файл будет заменен перекодированной версией.

Исходник:
On Error Resume Next
FullName = WScript.Arguments(0)
 
With CreateObject("ADODB.Stream")
    .Type = 2
    .Charset = "windows-1251"
    .Open
    .LoadFromFile FullName
    Text = .ReadText()
    .Close
 
    .Charset = "cp866"
    .Open
    .WriteText (Text)
    .SaveToFile FullName, 2
    .Close
End with
 Способ 3а. Ухищренный (для истинных кодеров).
Писать в блокноте кириллический текст в виде псевдосимволов (т.е. вручную перекодировать) ALT + код символа (на цифровой клавиатуре).

Способ 4. Он-лайн перекодировщик

Способ 5. Использовать стороннее ПО.