it-swarm.com.ru

Пакетное кодирование файлов

Я хотел бы иметь дело с именем файла, содержащим странные символы, такие как французский é.

Все отлично работает в оболочке:

C:\somedir\>ren -hélice hélice

Я знаю, если я помещу эту строку в файл .bat, я получу следующий результат:

C:\somedir\>ren -hÚlice hÚlice

Увидеть ? é были заменены на Ú.

То же самое верно для вывода команды. Если я dir какой-то каталог в командной консоли, вывод в порядке. Если я перенаправлю этот вывод в файл, некоторые символы преобразуются.

Итак, как я могу сказать cmd.exe, как интерпретировать то, что в моем командном файле отображается как é, действительно é, а не Ú или запятая?

Таким образом, при выполнении файла .bat нет способа дать подсказку о кодовой странице, в которой он был написан?

50
shodanex

Вы должны сохранить командный файл с OEM-кодировкой. Как это сделать, зависит от вашего текстового редактора. Кодировка, используемая в этом случае, также различна. Для западных культур это обычно CP850.

Пакетные файлы и кодировка - это две вещи, которые не особенно нравятся друг другу. Вы заметите, что Unicode также невозможно использовать там, к сожалению (хотя переменные окружения прекрасно с этим справляются).

Кроме того, вы можете настроить консоль на использование другой кодовой страницы:

chcp 1252

должен сделать свое дело. По крайней мере, у меня это сработало.

Когда вы делаете перенаправление вывода, например, с dir, применяются те же правила. Используется кодовая страница окна консоли. Вы можете использовать переключатель /u для cmd.exe для принудительного перенаправления вывода Unicode, что приводит к тому, что результирующие файлы будут в UTF-16.

Что касается кодировок и кодовых страниц в cmd.exe в целом, также смотрите этот вопрос:

EDIT: Что касается вашего редактирования: Нет, cmd всегда предполагает, что пакетный файл записывается в кодовую страницу консоли по умолчанию. Тем не менее, вы можете легко включить chcp в начале пакета:

chcp 1252>NUL
ren -hélice hélice

Чтобы сделать это более надежным при использовании непосредственно из командной строки, вы можете запомнить старую кодовую страницу и восстановить ее впоследствии:

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul
65
Joey

У меня были проблемы с этим, и вот решение, которое я нашел. Найдите десятичное число для символа, который вы ищете в вашей текущей кодовой странице.

Например, я нахожусь на кодовой странице 437 (chcp говорит вам), и я хочу знак степени,. http://en.wikipedia.org/wiki/Code_page_437 говорит мне, что знак степени - это число 248.

Затем вы найдете символ Unicode с тем же номером.

Символ Unicode на 248 (U + 00F8) является.

Если вы вставите символ Unicode в свой пакетный скрипт, он будет отображаться на консоли в качестве нужного вам символа.

Так что мой пакетный файл

echo

печать

°
1
dconman

Я создал следующий блок, который я положил в начале своих командных файлов:

set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
    rem Converting code page from 1252 to 850.
    rem My editors use 1252, my batch uses 850.
    rem We create a converted -850.bat file, and then launch it.
    set File850=%~n0-850.bat
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
    call %File850%
    del %File850%
    EXIT /b 0
:CONVERT_CODEPAGE_END
1
David Pontbriand

Я забочусь о трех понятиях:

  1. Кодировка консоли вывода

  2. Внутренняя кодировка командной строки (которая изменилась с помощью chcp)

  3. Текстовое кодирование .bat

Самый простой сценарий для меня: первые два будут упомянуты в одной и той же кодировке, скажем, CP850, и я буду хранить .bat в той же кодировке (в Notepad ++, меню Кодировка Наборы символов Западноевропейский OEM 850 ).

Но предположим, что кто-то передает мне .bat в другой кодировке, скажем, CP1252 (в Notepad ++, меню Encoding * → Наборы символов Западноевропейский Windows-1252 )

Тогда я бы изменил внутреннюю кодировку командной строки, используя chcp 1252.

Это изменяет кодировку, которую он использует для общения с другими процессами, ни с устройством ввода, ни с консолью вывода.

Таким образом, мой экземпляр командной строки будет эффективно отправлять символы в 1252 через свой дескриптор файла STDOUT, но застрявший текст появляется, когда консоль декодирует их как 850 (é is Ú).

Затем я изменяю файл следующим образом:

@echo off

Perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice

Сначала я отключаю echo, чтобы команды не выводились, если явно не выполняется echo ... или Perl -e "print ..."

Затем я ставлю этот шаблон каждый раз, когда мне нужно что-то вывести

Perl -e "использовать Encode qw/encode decode /;" -e "print encode ('cp850', decode ('cp1252', \" ren -hélice hélice\n\"));"

Я заменю текст, который я покажу, на это: ren -hélice hélice.

А также мне может понадобиться заменить кодировку консоли на cp850, а другую кодировку на стороне - на cp1252.

И чуть ниже я поставил нужную команду.

Я разбил проблемную строку на половину вывода и половину реальной команды.

  • Первое, что я сделаю наверняка: «é» интерпретируется как «é» посредством транскодирования. Это необходимо для всех выходных предложений, поскольку консоль и файл находятся в разных кодировках.

  • Во-вторых, настоящая команда (пробормотала @echo off), зная, что у нас одинаковая кодировка как из текста chcp, так и из .bat, достаточно для правильной интерпретации символов.

1
g.cze

У меня были польские знаки внутри кода в R (например, ą, ę, ź, ż и т.д.), И у меня была проблема при запуске этого скрипта R с файлом .bat (в выходном файле .Rout вместо этих знаков были такие знаки, как%, &, # и т. д., и код не выполнялся до конца).

Мое решение: 

  1. Сохранить скрипт R с кодировкой: Файл> Сохранить с кодировкой> CP1250
  2. Запустить .bat файл

Это сработало для меня, но если проблема не устранена, попробуйте использовать другие кодировки.

0
michal