Bat изменить кодировку файла

Обновлено: 21.11.2024

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

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

Затем я бы изменил внутреннюю кодировку командной строки на chcp 1252.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Видишь? é заменено на Ú.

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

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

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

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

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

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

Символ Unicode по адресу 248 (U+00F8) — это .

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

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

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

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

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

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

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

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

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

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

Я хотел автоматизировать создание файла дерева каталогов в Windows 10.

В PowerShell я выполнил следующие команды:

На выходе был симпатичный файл UTF-8:

Теперь я хотел сделать то же самое в пакетном файле:

Но вывод из выполнения пакетного файла имел испорченную кодировку:

Почему кодировка вывода PowerShell отличается от вывода пакетного файла?

Я знаю, что могу получить вывод в формате ASCII, добавив /a к команде дерева, но я бы предпочел, чтобы красивый вывод в кодировке UTF-8 сохранялся в моем файле дерева.

Я попытался изменить кодовую страницу, добавив "chcp 65001" в пакетный файл, но вывод файла не изменился.

2 ответа 2

Ответ LotPing правильный. Только для подробного описания:

Оператор перенаправления > (отправить указанный поток в файл):

  • в Powershell кодировка выходного файла — UCS-2 LE BOM:

При записи в файлы операторы перенаправления используют кодировку Unicode. Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Чтобы перенаправить содержимое в файлы, отличные от Unicode, используйте командлет Out-File с его параметром Encoding.

  • в командной строке Windows ( cmd.exe ):
    • cmd.exe /A (по умолчанию): кодировка выходного файла — ANSI и
    • cmd.exe /U : кодировка выходного файла — UCS-2 LE (без спецификации):

    Оболочка CMD может перенаправлять ASCII/ANSI (по умолчанию) или Unicode (файл UCS-2), но не UTF-8.
    Это можно выбрать, запустив CMD /A или CMD /U .

    Однако выходные данные довольно устаревшей утилиты tree.com не готовы к преобразованию в Unicode. Таким образом, прямой запуск "" cmd /U /C "tree>tree_U.txt" по-прежнему создает (mojibake) искаженный файл в кодировке ANSI. Следующие команды cmd должны помочь:

    Кстати, вот эти красивые символы и их коды (искаженные в ANSI):

    Мне нужно изменить кодировку файла с текущей на utf-16,
    и я хотел бы сделать это программно без особых хлопот. Выполнив
    несколько поисков, я наткнулся на chcp и различные несвязанные инструменты Windows.
    Я бы предпочел, чтобы не было внешних зависимостей, но если это
    не легко выполнимо, в пакетном файле должно быть как можно меньше зависимостей.

    Поиск, который я выполнял, ссылается на chcp 1201 и chcp 65001, но при выполнении
    первого в командной строке я получаю сообщение об ошибке неверной кодовой страницы.

    Будем очень признательны за любые указания по изменению типа файла!

    Дэвид Солимано

    Вт, 11 октября 2016 г., 15:40:34 -07:00, Шон
    написал:

    >Привет всем,
    >
    > Мне нужно изменить кодировку файла с какой она сейчас на utf-16
    >и я хотел бы сделать это программно без особых усилий хлопот. Выполнив
    >несколько поисков, я наткнулся на chcp и различные несвязанные инструменты Windows.
    >Я бы предпочел, чтобы не было никаких внешних зависимостей, но если это
    >не легко выполнимо, объедините в пакетный файл как можно меньше зависимостей.
    >
    >Поиск, который я выполнил, ссылается на chcp 1201 и chcp 65001, но при выполнении
    >первого в командной строке я получаю ошибку неверной кодовой страницы.

    >
    >Будем очень признательны за любые указания по изменению типа файла!

    Но, разумеется, только для Windows.

    14.10.2016, 22:47, Дэвид Солимано написал:
    > Во вторник, 11 октября 2016, 15:40:34 -07:00, Шон
    > написал:
    >
    >> Привет всем,
    >>
    >> Мне нужно изменить кодировку файла с какой она сейчас на utf-16
    >> и я хотел бы сделать это программно без особых хлопот. Выполнив
    >> несколько поисков, я наткнулся на chcp и различные несвязанные инструменты Windows.
    >> Я бы предпочел, чтобы не было никаких внешних зависимостей, но если это
    >> не легко выполнимо, объедините в пакетный файл как можно меньше зависимостей.
    >>
    >> Поиски, которые я выполнял по ссылкам chcp 1201 и chcp 65001, но выполняя
    >> первый в командной строке, я получаю ошибку неверной кодовой страницы.
    >
    > chcp изменяет кодовую страницу вашей консоли, поэтому я не думаю, что
    > вам поможет.

    icon выглядит довольно многообещающе. Похоже, что мне нужно указать
    существующий тип файла, но быстрый тест, который я провел на freebsd,
    похоже, что я могу подделать его.

    % touch david
    % echo "hello david" > david
    % file david
    david: текст ASCII
    % iconv -f UTF-8 -t UTF-16 d
    % file d
    d: текст Unicode UTF-16 с обратным порядком байтов

    Да, окна. Клиенты разные, windows 7 или xp и сервер тоже
    разный-2008 или 2012.

    Я использую "UltraEdit Text/Hex Editor (x64) Version 24.20.0.40".

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

    Я включил несколько скриншотов и один из кодов пакетного скрипта, с которым у меня возникла проблема.

    Приведенный выше код пакетного сценария при сохранении с помощью Блокнота выполняется правильно, как вы можете видеть по ссылке ниже.

    Приведенный выше код пакетного сценария при сохранении с помощью UltraEdit выполняется, как показано на снимке экрана ниже.


    Могу ли я получить совет по решению этой проблемы. Спасибо!

    Похоже, вы ничего не знаете о кодировке символов и почему все настройки кодировки в конфигурации UltraEdit означают, в чем здесь проблема.

    1. Откройте «Дополнительно» — «Настройки» или «Конфигурация» — «Обработка файлов» — «Сохраните» и снимите флажки с двух параметров:
      • Записывать заголовок спецификации UTF-8 во все файлы UTF-8 при сохранении
      • Записывать спецификацию UTF-8 в новые файлы, созданные в этой программе (если выше не установлено)
    2. При следующем использовании функции «Сохранить как» убедитесь, что для параметра Кодировка установлено значение По умолчанию, и обратите внимание на этот параметр в будущем при сохранении нового файла.

    В зависимости от различных критериев, таких как версия Windows, набор шрифтов для консоли, файлы . можно использовать кодировку UTF-8 для пакетных файлов, но пакетный файл должен изменить в первой строке «кодовую страницу» на UTF-8 для правильного выполнения остальной части пакетного файла. Дополнительные сведения о пакетных файлах в кодировке UTF-8 см. в ответе Stack Overflow на использование другого языка (кодовой страницы) в пакетном файле, созданном для других.

    Две настройки: Записывать заголовок спецификации UTF-8 во все файлы UTF-8 при сохранении и Записывать спецификацию UTF-8 в новые файлы, созданные в этой программе (если выше не установлено) в разделе «Дополнительно» — «Настройки» или «Конфигурация» — «Обработка файлов» — «Сохранить» определите, сохраняется ли новый файл, созданный в кодировке UTF-8, без спецификации (знак порядка байтов) или со спецификацией по умолчанию с параметром Кодировка. в диалоговом окне «Сохранить как» установите значение По умолчанию. Если для пакетного файла используется кодировка UTF-8, хотя это и не рекомендуется, пакетный файл в кодировке UTF-8 необходимо сохранить без спецификации. Интерпретатор команд Windows интерпретирует спецификацию как первые 3 символа командной строки для обработки и выполнения, что всегда приводит к сообщению об ошибке для первой строки в пакетном файле. Большинство приложений не поддерживают файлы в кодировке UTF-8 со спецификацией. По этой причине лучше всего, чтобы оба параметра сохранения, связанные с UTF-8, не проверялись в конфигурации UltraEdit.

    Поэтому, если вы используете UltraEdit в основном для пакетного редактирования файлов, я настоятельно рекомендую выбрать ANSI (1 байт на символ) в качестве кодировки по умолчанию (для новых файлов и файлов, открытых при сбое автоматического определения) . И я рекомендую настроить UltraEdit, как написано в темах, упомянутых выше, чтобы редактировать файлы *.bat и *.cmd по умолчанию, используя набор символов OEM (кодовую страницу) в соответствии с настройками вашего региона вместо кодовой страницы Windows-1254 на случай, если вы когда-нибудь записывать символы, отличные от ASCII, в пакетный файл.

    Но если UltraEdit в основном используется для редактирования файлов HTML и XML в кодировке UTF-8, оставьте значение UTF-8 для кодировки по умолчанию (для новых файлов и файлов, открытых при сбое автоматического определения), но убедитесь, что настройки Записывать спецификацию UTF-8 во все файлы UTF-8 при сохранении и Записывать спецификацию UTF-8 в новые файлы, созданные в этой программе (если выше не установлено)< /em> оба не проверяются. Файлы HTML и XML в кодировке UTF-8 также должны быть сохранены без BOM, поскольку в файле есть метатег charset (HTML, XHTML), соответственно, атрибут кодирования (XML), который информирует все приложения, интерпретирующие данные о кодировке символов в файле. . См. также мой пост о поддерживаемой кодировке HTML/XHTML UTF-8 и декларациях кодировки XML UTF-8.

    Пока пакетный файл не содержит ни одного символа с кодовым значением выше 127 десятичного знака, нет никакой разницы между пакетным файлом в кодировке UTF-8 без спецификации и пакетным файлом в кодировке ASCII/ANSI/OEM. Пакетный файл использует в этом случае только символы ASCII, которые закодированы одинаково во всех кодировках символов.

    Но если новый файл создается по умолчанию в кодировке UTF-8, а пакетный файл должен быть в OEM-кодировке, как ожидается интерпретатором команд Windows на вашем компьютере с настройками вашего региона, из-за содержания символа, отличного от ASCII, с кодовым значением больше 127. десятичный и вообще доступный в кодовой странице OEM, вам необходимо преобразовать новый пакетный файл в кодировке UTF-8 с кодом/текстом из UTF-8 в ASCII (многобайтовый в однобайтовый на символ) с выбором правильного кода OEM страница.

    Конечно, также можно использовать макрос, хранящийся в файле макроса, который автоматически загружается при запуске UltraEdit, которому назначена горячая клавиша для быстрого выполнения по ключу, чтобы создать новый пакетный файл с кодировкой, необходимой для пакетных файлов. Я использую такой макрос для создания нового пакетного файла, нажав Ctrl+Shift+B, который всегда является файлом, отличным от Unicode, независимым от настроек конфигурации для новых файлов, и который автоматически редактируется с включенным набором символов OEM после его сохранения как *.bat или *.cmd-файл. Код макроса прост:

    Файл, созданный этим макросом, всегда кодируется 1 байтом на символ с окончанием строки DOS/Windows, если для параметра Кодировка в диалоговом окне "Сохранить как" задано значение По умолчанию. при следующем сохранении нового командного файла с расширением файла .bat или .cmd (отличается обработкой кода выхода (уровень ошибки)), чтобы сохранить кодировку нового файла, заданную макросом при сохранении.

    Читайте также: