CMD/BAT - ANSI<->ASCII
-
akrav
CMD/BAT - ANSI<->ASCII
Подскажите, пожалуйста, как можно командной строкой конвертировать текстовой файл из dos кодировки в windows?
-
hasherfrog
Re: CMD/BAT - ANSI<->ASCII
UPDATE: решение найдено, см. ниже.
К сожалению, командной строкой я не смог. Никак*. Проблема в том, что даже смена кодовой страницы (командами mode con cp select=XXX или chcp XXX) не может повлиять на результаты команд type или echo**, поскольку они внутри себя явно заточены на использование дефолтной 866-й страницы (и весь вывод пропускают через CharToOem()-функцию). Это можете проверить, можете поверить на слово.
Вариантами решения могут быть:
1. Использование сторонних перекодировщиков (я использовал recode), есть масса других консольных утилит.
2. Написание своего перекодировщика (см.
___
* В принципе, может кто и сможет это сделать. Но тогда как объяснить вот такое поведение cmd.exe:
Код:
__
** Сначала я ляпнул про echo[/i], но вообще-то она тут не при чём, конечно (ей что дали, то она и вывела). Другое дело, что её использовать тоже не получится. Пример:
Файл 1.bat, кодировка ДОСа:
Код:
Результат выполнения:
Код:
К сожалению, командной строкой я не смог. Никак*. Проблема в том, что даже смена кодовой страницы (командами mode con cp select=XXX или chcp XXX) не может повлиять на результаты команд type или echo**, поскольку они внутри себя явно заточены на использование дефолтной 866-й страницы (и весь вывод пропускают через CharToOem()-функцию). Это можете проверить, можете поверить на слово.
Вариантами решения могут быть:
1. Использование сторонних перекодировщиков (я использовал recode), есть масса других консольных утилит.
2. Написание своего перекодировщика (см.
тут
что-то вроде образца).___
* В принципе, может кто и сможет это сделать. Но тогда как объяснить вот такое поведение cmd.exe:
Код:
Код: Выделить всё
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\hasherfrog>chcp 866
Текущая кодовая страница: 866
C:\Documents and Settings\hasherfrog>echo йцукен > 1.txt
C:\Documents and Settings\hasherfrog>chcp 1251
╥хъє∙р ъюфютр ёЄЁрэшЎр: 1251
C:\Documents and Settings\hasherfrog>type 1.txt
йцукен for /f %i in (1.txt) do echo %i
C:\Documents and Settings\hasherfrog>echo йцукен
йцукен __
** Сначала я ляпнул про echo[/i], но вообще-то она тут не при чём, конечно (ей что дали, то она и вывела). Другое дело, что её использовать тоже не получится. Пример:
Файл 1.bat, кодировка ДОСа:
Код:
Код: Выделить всё
chcp 1251
@echo йцукен
chcp 866
@echo йцукенРезультат выполнения:
Код:
Код: Выделить всё
C:\Documents and Settings\hasherfrog>1.bat
C:\Documents and Settings\hasherfrog>chcp 1251
╥хъє∙р ъюфютр ёЄЁрэшЎр: 1251
йцукен
C:\Documents and Settings\hasherfrog>chcp 866
Текущая кодовая страница: 866
йцукен-
ven00m
Re: CMD/BAT - ANSI<->ASCII
Неуверен но можт так:
text.bat
Код:
run.bat
Код:
Если запустить run то
Получается на входе text1.txt:
Код:
На выходе text2.txt:
Код:
если надо наоборот то вместо /u написать /a
text.bat
Код:
Код: Выделить всё
type text1.txt>>text2.txtrun.bat
Код:
Код: Выделить всё
cmd.exe /u /c text.batЕсли запустить run то
Получается на входе text1.txt:
Код:
Код: Выделить всё
йцукенНа выходе text2.txt:
Код:
Код: Выделить всё
щЎєъхэесли надо наоборот то вместо /u написать /a
-
hasherfrog
Re: CMD/BAT - ANSI<->ASCII
ven00m, не совсем так (/u даст юникод, а не window-кодировку), но идея правильная.
Решение вот такое, текст файла typea.bat
Код:
Решение вот такое, текст файла typea.bat
Код:
Код: Выделить всё
@if "%1"=="" goto error
@if "%2"=="" goto error
@if not exist %2 goto error
@if "%1"=="/a" (
@chcp 866 >nul
@goto print
)
@if "%1"=="/w" (
@chcp 1251 >nul
@goto print
)
@goto error
:print
@type %2 >> ___tmptxt
@type ___tmptxt
@del ___tmptxt
@chcp 866 >nul
@goto exithere
:error
@echo Usage:
@echo typea /a filename.txt - Print filename.txt as dos-866
@echo typea /w filename.txt - Print filename.txt as win-1251
:exithere-
akrav
Re: CMD/BAT - ANSI<->ASCII
Спасибо, hasherfrog!
только вот что-то под xp не работает из дос в win кодировку. перенаправил вывод в файл, а он как был, так и остался...
только вот что-то под xp не работает из дос в win кодировку. перенаправил вывод в файл, а он как был, так и остался...
-
hasherfrog
Re: CMD/BAT - ANSI<->ASCII
akrav, вот с перенаправлением нужно подумать. Вы обратите внимание на код. Мне кажется, в виде конвейера или перенаправления не получится использовать отдельный (приведённый выше) батник, вместо этого Вам надо его код переделать (встроиться туда, где @type ___tmptxt).
-
akrav
Re: CMD/BAT - ANSI<->ASCII
Очень интересно! Однако пока с полезным результатом напряженка. Ни туда, ни обратно конвертации не происходит, что можно пронаблюдать в файле ___tmptxt, который насколько я понял создается перенаправление вывода.