Пакетное кодирование файлов - PullRequest
53 голосов
/ 15 сентября 2009

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

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

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

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

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

Видишь? é были заменены на Ú.

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

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

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

Ответы [ 5 ]

67 голосов
/ 15 сентября 2009

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

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

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

chcp 1252

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

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

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

РЕДАКТИРОВАНИЕ: Что касается вашего редактирования: Нет, 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
1 голос
/ 18 октября 2017

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

Мое решение:

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

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

1 голос
/ 25 ноября 2014

Меня волнуют три понятия:

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

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

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

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

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

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

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

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

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

@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 голос
/ 24 июня 2014

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

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

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

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

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

Итак, мой командный файл

echo

печать

°
1 голос
/ 30 сентября 2013

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...