Показать полную графическую версию : [решено] Ошибка перекодировки русских символов
taravasya
16-02-2010, 09:07
Из bat файла, создаю текстовый файл, в который вносится переменная содержащая русские символы. Программа которая использует этот файл, видимо пытается перекодировать его в US ASCII. Пишет вот такую ерунду:
INFO: Locale=C
INFO: Converting filenames to US-ASCII
ERR: Cannot convert UTF8 string
С какой-бы кодировкой я не создавал файл, получаю ошибку. Либо эту. Либо если создаю с его кодировкой, то вместо русских символов получаю ????.mpg
Прочитал про утилиту recode, надеялся с её помощью попробовать выкрутиться - но нигде ее не нашёл. На wiki пишут "видимо прекратили поддержку". По ссылке с wiki закачки нет.
Может ли кто нибудь подсказать мне, как мне выход из этой ситуации?
taravasya,
1. нужен пример батника и пример файла;
2. а если файл создать сразу в UTF-8, например блокнотом?
taravasya
16-02-2010, 09:45
Дело в том, что в этот документ, записывается 5 пустых параметров, и 6-й. 6-й параметр - это имя файла, который в последствии предстоит обработать этой вредной программой. Файл этот может быть и не один. Их может быть много. И генерация текстового файла находится внутри цикла. По-очереди к каждому возможно присутствующему файлу. Однако я пробовал подсунуть созданный вручную файл - результат, тот-же.
Вот код bat-ника
chcp 65001
set mx=mplex.exe -f 8 -o
set compl=dvdauthor
set demuxfld=f:\demuxed
set remuxfld=f:\remuxed
set outptfld=f:\compling
for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
for %%b in (%remuxfld%\*) do (
ECHO ^<dvdauthor^> >config.txt
ECHO ^<vmgm /^> >>config.txt
ECHO ^<titleset^> >>config.txt
ECHO ^<titles^> >>config.txt
ECHO ^<pgc^> >>config.txt
ECHO ^<vob file="%%b" /^> >>config.txt
ECHO ^</pgc^> >>config.txt
ECHO ^</titles^> >>config.txt
ECHO ^</titleset^> >>config.txt
ECHO ^</dvdauthor^> >>config.txt
recode
%compl% -o %%~nb -x config.txt
)
Текущую таблицу символов варьировал по-разному. И сам bat сохранял с разными настройками.
Текстовый файл "приаттачил"
Только что нашел этот recode. Сейчас разбираюсь с его синтаксисом. И во обще с тем, что он может. И сможет ли он мне помочь.
PS/ Думаю поймёте, что это должен был быть xml. По-началу я его и создавал. Результат тот же. Объявлять кодировку xml, в начале файла пробовал. Как utf, так и windows-1251(Как правильно задать US-ASCII - не знаю. Но подозреваю, что если задам, то русские символы станут нечитаемы и в блакноте)
taravasya, попробуй убрать CHCP и заменить одну строку в батнике на:
CHCP 65001| >>config.txt ECHO ^^^<vob file="%%b" /^^^> &CHCP 866
taravasya
16-02-2010, 10:30
Что то изменилось....
config.txt:6: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xC7 0xE0 0xF5 0xE0
^
ERR: Error in parsing XML
В какой кодировке сохранить сам bat?
На сколько я понял, надо убрать
chcp 65001
в самом начале
а вместо
ECHO ^<vob file="%%b" /^> >>config.txt
Вставить Вашу строчку?
CHCP 65001| >>config.txt ECHO ^^^<vob file="%%b" /^^^> &CHCP 866
taravasya, кодировка батника родная DOS/866
приложите текстовый файл, полученный батником
кстати, ранее выложенный файл 100% рабочий?
taravasya
16-02-2010, 11:00
кстати, ранее выложенный файл 100% рабочий? »
Что Вы имеете ввиду? У меня в блокноте он открывается нормально. Русские символы отображются правильно. Сгенерирован он был из bat файла с указанными выше настройками.
Теперь код выглядет так:
rem set mx=mplex.exe -f 8 -o
set compl=dvdauthor
rem set demuxfld=f:\demuxed
set remuxfld=f:\remuxed
set outptfld=f:\compling
rem for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
for %%b in (%remuxfld%\*) do (
ECHO ^<dvdauthor^> >config.txt
ECHO ^<vmgm /^> >>config.txt
ECHO ^<titleset^> >>config.txt
ECHO ^<titles^> >>config.txt
ECHO ^<pgc^> >>config.txt
>>config.txt ECHO ^^^<vob file="%%b" /^^^> &CHCP 866
rem ECHO ^<vob file="%%b" /^> >>config.txt
ECHO ^</pgc^> >>config.txt
ECHO ^</titles^> >>config.txt
ECHO ^</titleset^> >>config.txt
ECHO ^</dvdauthor^> >>config.txt
%compl% -o %%~nb -x config.txt
)
Добавляю новый текстовый файл. Визуально он ничем не отличается.
Ошибка снова вот такая:
INFO: Locale=C
INFO: Converting filenames to US-ASCII
ERR: Cannot convert UTF8 string '
taravasya
16-02-2010, 11:11
Я прошу прощения....Совсем уже запутался.
bat сохранил в 866
текст батника выше указанный.
Актуальный результат прилагаю к этому сообщению...
В окне cmd вижу следующее
config.txt:6: parser error : error parsing attribute name
^<vob file="f:\remuxed\Р-Р°С:Р°С?РчР?РєР?1_1.mpg" /^>
^
config.txt:6: parser error : attributes construct error
^<vob file="f:\remuxed\Р-Р°С:Р°С?РчР?РєР?1_1.mpg" /^>
^
config.txt:6: parser error : Couldn't find end of Start Tag vob
^<vob file="f:\remuxed\Р-Р°С:Р°С?РчР?РєР?1_1.mpg" /^>
^
ERR: Error in parsing XML
Что Вы имеете ввиду? »
для начала вам нужно разобраться какой файл вы должны получить, т.е. иметь пример рабочего config.txt, правильно обрабатываемого программой, тогда будет ясно к чему стремиться
В окне cmd вижу следующее »
само собой, в последнем случае вы зачем-то убрали "CHCP 65001|", из строки вывода, поэтому и появился лишний "^"
taravasya
16-02-2010, 11:29
Этот файл абсолютно валидный, хоть txt хоть xml. Но если в нём нет русских букв. Тоесть в той же папке у меня лежит другой видео файл, с именем 001.mpg С этим файлом всё проходит без задоринки.
в последнем случае вы зачем-то убрали "CHCP 65001 »
Вот валянок... решил что Вы опечатались... Щас буду мучить.
taravasya
16-02-2010, 11:47
rem set mx=mplex.exe -f 8 -o
set compl=dvdauthor
rem set demuxfld=f:\demuxed
set remuxfld=f:\remuxed
set outptfld=f:\compling
rem for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
for %%b in (%remuxfld%\*) do (
rem Echo ^<?xml version="1.0" encoding="US-ASCII"?^> >config.xml
ECHO ^<dvdauthor^> >config.xml
ECHO ^<vmgm /^> >>config.xml
ECHO ^<titleset^> >>config.xml
ECHO ^<titles^> >>config.xml
ECHO ^<pgc^> >>config.xml
CHCP 65001| >>config.xml ECHO ^^^<vob file="%%b" /^^^> &CHCP 866
rem ECHO ^<vob file="%%b" /^> >>config.xml
ECHO ^</pgc^> >>config.xml
ECHO ^</titles^> >>config.xml
ECHO ^</titleset^> >>config.xml
ECHO ^</dvdauthor^> >>config.xml
%compl% -o %%~nb -x config.xml
)
Так вроде бы всё верно?
Ответ:
INFO: Locale=C
INFO: Converting filenames to US-ASCII
ERR: Cannot convert UTF8 string 'Р-Р°С:Р°С?РчР?РєР?1_1.mpg': Invalid or incomplete multibyte or wide character
Файл скинул.
Дополнительно, попробовал деларировать кодировку xml US-ASCII(то что сейчас под ремаркой), получаю вот такое:
config.xml:7: parser error : AttValue: ' expected
<vob file="f:\remuxed\
^
config.xml:7: parser error : attributes construct error
<vob file="f:\remuxed\
^
config.xml:7: parser error : Couldn't find end of Start Tag vob
<vob file="f:\remuxed\
^
ERR: Error in parsing XML
То есть видимо он её не перекодирует, но и не понимает... Не зря видать перекодировать пытается....
Самое интересное, что с русскими папками эта прога работает номально.
taravasya, похоже, dvdauthor работает только с английскими именами в XML-файле... так что - либо искать другую утилиту, либо придумывать алгоритм временного переименования файлов перед их обработкой
taravasya
16-02-2010, 13:40
похоже, dvdauthor работает только с английскими именами в XML-файле... »
Вот этого я и боялся.
либо придумывать алгоритм временного переименования файлов перед их обработкой »
То-есть как бы я не извращался, "родного" имени всё равно не будет? Проблема в том, что видео складывается с нескольких компов, разными пользователями, с разным уровнем подготовки и усидчивости. А значит если кто-то из них забудет что по-русски называть нельзя - всё пойдёт на смарку....
А что на счёт recode? Вы не знаете как с ней работать? Я же её в принципе нашел... но что-то никак не разберусь с синтаксисом.
То-есть как бы я не извращался, "родного" имени всё равно не будет? »можно переименовать файл(ы), провести обработку и вернуть имя обратно
А что на счёт recode? »а смысл?.. русский в любой кодировке останется русским, а программа по ходу работает только с английским
El Sanchez
16-02-2010, 17:58
можно переименовать файл(ы), провести обработку и вернуть имя обратно »
Вот это правильно, так и сделаем
@echo off
set mx=mplex.exe -f 8 -o
set compl=dvdauthor
set demuxfld=f:\demuxed
set remuxfld=f:\remuxed
set outptfld=f:\compling
call :xml
for %%a in (%demuxfld%\*.mpv) do %mx% "%remuxfld%\%%~na.mpg" "%demuxfld%\%%~na.mpv" "%demuxfld%\%%~na.mpa"
for %%b in (%remuxfld%\*.mpg) do (
ren "%%~fb" tempfile.mpg
start /wait %compl% -o tempfile.mpg -x config.xml
ren "%%~dpbtempfile.mpg" "%%~nb.mpg"
)
goto :eof
:xml
echo ^<dvdauthor^> >config.xml
echo ^<vmgm /^> >>config.xml
echo ^<titleset^> >>config.xml
echo ^<titles^> >>config.xml
echo ^<pgc^> >>config.xml
echo ^<vob file="tempfile.mpg" /^> >>config.xml
echo ^</pgc^> >>config.xml
echo ^</titles^> >>config.xml
echo ^</titleset^> >>config.xml
echo ^</dvdauthor^> >>config.xml
taravasya
16-02-2010, 20:03
El Sanchez,
Что то видимо с goto не то? Исполнение проскакивает ремукс, создает xml файл где (<vob file="%b" />) ??? И уходит на запись. Писать нечего. И оно останавливается всё. Выкладываю текст всего проекта. Может я что-то натупил?
rem Проверяем есть ли запланированное кодирование
IF EXIST f:\Work\jobesecl\job.ecl (
Call :ccenc
) ELSE (
Call :mkdvd
)
rem Вызываем CinemaCraft Encoder для выполнения задания
:ccenc
ccew -ecl f:\Work\jobesecl\job.ecl -batch
rem Авторинг
rem Приложения
:mkdvd
set mx=.\DVDauthor\mplex.exe -f 8 -o
set compl=.\DVDauthor\dvdauthor
set brnr="%programfiles%\Nero\Nero 9\Nero Express\NeroCmd.exe" --write --drivename g --iso photomir --DVD --dvdvideo_cmpt --create_iso_fs --create_udf_fs --iso-no-joliet --dvdvideo_realloc --recursive "f:\Work\compiled\
rem Папки
set demuxfld=f:\work\demuxed
set remuxfld=f:\work\remuxed
set outptfld=f:\work\compiled
call :xml
rem Ремуксинг
for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
rem Компиляция DVD
for %%b in (%remuxfld%\*.mpg) do (
ren "%%~fb" tempfile.mpg
start /wait %compl% -o tempfile.mpg -x config.xml
ren "%%~dpbtempfile.mpg" "%%~nb.mpg"
)
goto :eof
:xml
ECHO ^<dvdauthor^> >config.xml
ECHO ^<vmgm /^> >>config.xml
ECHO ^<titleset^> >>config.xml
ECHO ^<titles^> >>config.xml
ECHO ^<pgc^> >>config.xml
ECHO ^<vob file="%%b" /^> >>config.xml
ECHO ^</pgc^> >>config.xml
ECHO ^</titles^> >>config.xml
ECHO ^</titleset^> >>config.xml
ECHO ^</dvdauthor^> >>config.xml
rem Очистка remux файлов
for %%c in (%remuxfld%\*) do (
Del %%c
)
rem Запись DVD-Video
rem for /D %%d in ("%outptfld%\*") do (
rem %brnr%%%~nd"
rem )
echo "КОНЕЦ"
Pause
Exit
Если есть критика - я жду. Как можно оптимизировать всё это. Подстраховаться на случай ошибок. Ну и конечно же надеюсь, что придумаем что-нибудь с русскими символами.
El Sanchez
16-02-2010, 22:11
Что то видимо с goto не то? Исполнение проскакивает ремукс, создает xml файл где (<vob file="%b" />) ??? И уходит на запись. Писать нечего »
taravasya, ну так как код вставили (причем с ошибками), так он и отработал.
Покурил немного мануал и вот изменения
@echo off
rem Проверяем есть ли запланированное кодирование
IF EXIST "f:\Work\jobesecl\job.ecl" (
Call :ccenc
) ELSE (
Call :mkdvd
)
rem Вызываем CinemaCraft Encoder для выполнения задания
:ccenc
ccew -ecl "f:\Work\jobesecl\job.ecl" -batch
rem Авторинг
rem Приложения
:mkdvd
set mx=.\DVDauthor\mplex.exe -f 8 -o
set compl=.\DVDauthor\dvdauthor.exe
set brnr="%programfiles%\Nero\Nero 9\Nero Express\NeroCmd.exe" --write --drivename g --iso photomir --DVD --dvdvideo_cmpt --create_iso_fs --create_udf_fs --iso-no-joliet --dvdvideo_realloc --recursive "f:\Work\compiled\
rem Папки
set demuxfld=f:\work\demuxed
set remuxfld=f:\work\remuxed
set outptfld=f:\work\compiled
rem Ремуксинг
for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
call :xml
rem Компиляция DVD
for %%b in (%remuxfld%\*.vob) do (
ren "%%~fb" tempfile.vob
%compl% -o %outptfld% -x config.xml
ren "%%~dpbtempfile.vob" "%%~nb.vob"
)
rem Очистка remux файлов
del %remuxfld% /F /Q
rem Запись DVD-Video
for /D %%d in ("%outptfld%\*") do %brnr%%%~nd"
echo "КОНЕЦ"
pause
goto :eof
:xml
echo ^<dvdauthor^> >config.xml
echo ^<vmgm /^> >>config.xml
echo ^<titleset^> >>config.xml
echo ^<titles^> >>config.xml
echo ^<pgc^> >>config.xml
echo ^<vob file="%remuxfld%\tempfile.vob" /^> >>config.xml
echo ^</pgc^> >>config.xml
echo ^</titles^> >>config.xml
echo ^</titleset^> >>config.xml
echo ^</dvdauthor^> >>config.xml
taravasya
20-02-2010, 04:40
Почти....
for %%b in (%remuxfld%\*.vob) do (
ren "%%~fb" tempfile.vob
%compl% -o %outptfld%ВОТ ТУТ ДОЛЖЕН БЫТЬ \Имя исходного файла. Иначе компиляция будет заменяться одна другой. А мне надо что бы они были каждая в своей папке -x config.xml
ren "%%~dpbtempfile.vob" "%%~nb.vob"
)
El Sanchez
20-02-2010, 09:09
taravasya, у утилиты ключ -o означает вывод в каталог, а никак не вывод в файл
Обновление кода
@echo off
rem Проверяем есть ли запланированное кодирование
IF EXIST "f:\Work\jobesecl\job.ecl" (
Call :ccenc
) ELSE (
Call :mkdvd
)
rem Вызываем CinemaCraft Encoder для выполнения задания
:ccenc
ccew -ecl "f:\Work\jobesecl\job.ecl" -batch
rem Авторинг
rem Приложения
:mkdvd
set mx=.\DVDauthor\mplex.exe -f 8 -o
set compl=.\DVDauthor\dvdauthor.exe
set brnr="%programfiles%\Nero\Nero 9\Nero Express\NeroCmd.exe" --write --drivename g --iso photomir --DVD --dvdvideo_cmpt --create_iso_fs --create_udf_fs --iso-no-joliet --dvdvideo_realloc --recursive "f:\Work\compiled\
rem Папки
set demuxfld=f:\work\demuxed
set remuxfld=f:\work\remuxed
set outptfld=f:\work\compiled
echo ^<dvdauthor^> >config.xml
echo ^<vmgm /^> >>config.xml
echo ^<titleset^> >>config.xml
echo ^<titles^> >>config.xml
echo ^<pgc^> >>config.xml
echo ^<vob file="%remuxfld%\tempfile.vob" /^> >>config.xml
echo ^</pgc^> >>config.xml
echo ^</titles^> >>config.xml
echo ^</titleset^> >>config.xml
echo ^</dvdauthor^> >>config.xml
rem Ремуксинг
for %%a in (%demuxfld%\*.mpv) do %mx% %remuxfld%\%%~na.mpg %demuxfld%\%%~na.mpv %demuxfld%\%%~na.mpa
rem Компиляция DVD
for %%b in (%remuxfld%\*.vob) do (
md "%outptfld%\%%~nb"
ren "%%~fb" tempfile.vob
dvdauthor -o "%outptfld%\%%~nb" -x config.xml
ren "%%~dpbtempfile.vob" "%%~nb.vob"
)
rem Очистка remux файлов
del %remuxfld% /F /Q
rem Запись DVD-Video
for /D %%d in ("%outptfld%\*") do %brnr%%%~nd"
echo "КОНЕЦ"
pause
taravasya
20-02-2010, 11:56
Эт я понимаю :) Я имел ввиду что папка должна создаться с именем полученным от файла. Ну во общем у Вас вроде бы это сейчас и вышло. Как появиться возможность проверю.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.