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