Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - ANSI<->ASCII

Ответить
Настройки темы
CMD/BAT - ANSI<->ASCII

Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: akrav
Дата: 09-01-2008
Подскажите, пожалуйста, как можно командной строкой конвертировать текстовой файл из dos кодировки в windows?

Отправлено: 16:46, 09-01-2008

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


UPDATE: решение найдено, см. ниже.
К сожалению, командной строкой я не смог. Никак*. Проблема в том, что даже смена кодовой страницы (командами 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
йцукен <- ??? должны быть кракозябли

C:\Documents and Settings\hasherfrog>for /f %i in (1.txt) do echo %i

C:\Documents and Settings\hasherfrog>echo йцукен
йцукен <- ???
__
** Сначала я ляпнул про echo, но вообще-то она тут не при чём, конечно (ей что дали, то она и вывела). Другое дело, что её использовать тоже не получится. Пример:
Файл 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
йцукен

Последний раз редактировалось hasherfrog, 14-01-2008 в 12:01. Причина: Добавил примеры "почему"

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:56, 11-01-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для ven00m

Пользователь


Сообщения: 76
Благодарности: 12

Профиль | Отправить PM | Цитировать


Неуверен но можт так:

text.bat
Код: Выделить весь код
type text1.txt>>text2.txt
run.bat
Код: Выделить весь код
cmd.exe /u /c text.bat
Если запустить run то

Получается на входе text1.txt:
Код: Выделить весь код
йцукен
На выходе text2.txt:
Код: Выделить весь код
щЎєъхэ
если надо наоборот то вместо /u написать /a

Последний раз редактировалось ven00m, 11-01-2008 в 22:34. Причина: ошибко

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:05, 11-01-2008 | #3


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


ven00m, не совсем так (/u даст юникод, а не window-кодировку), но идея правильная.

Решение вот такое, текст файла 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

Последний раз редактировалось hasherfrog, 14-01-2008 в 12:03. Причина: Добавил @ и возврат в локаль dos (чисто для красоты :])

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:57, 14-01-2008 | #4


Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


Спасибо, hasherfrog!
только вот что-то под xp не работает из дос в win кодировку. перенаправил вывод в файл, а он как был, так и остался...

Отправлено: 13:35, 14-01-2008 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


akrav, вот с перенаправлением нужно подумать. Вы обратите внимание на код. Мне кажется, в виде конвейера или перенаправления не получится использовать отдельный (приведённый выше) батник, вместо этого Вам надо его код переделать (встроиться туда, где @type ___tmptxt).
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:50, 15-01-2008 | #6


Пользователь


Сообщения: 58
Благодарности: 1

Профиль | Отправить PM | Цитировать


Очень интересно! Однако пока с полезным результатом напряженка. Ни туда, ни обратно конвертации не происходит, что можно пронаблюдать в файле ___tmptxt, который насколько я понял создается перенаправление вывода.

Отправлено: 11:22, 16-01-2008 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - ANSI<->ASCII

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Esc-последовательности в BAT-файлах (ansi.sys) AndreyY89 Microsoft Windows 2000/XP 8 16-03-2012 07:05
Установка - ANSI code page is not installed... Saxofon Microsoft Windows 2000/XP 6 16-03-2009 21:39
[решено] dec2hex|ascii semiono AutoIt 6 15-02-2009 11:37
ASCII-последовательности lunas Программирование и базы данных 2 09-02-2003 23:54
ASCII-последовательности lunas Хочу все знать 6 05-02-2003 14:24




 
Переход