Войти

Показать полную графическую версию : [решено] Ошибка перекодировки русских символов


Страниц : [1] 2

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 закачки нет.
Может ли кто нибудь подсказать мне, как мне выход из этой ситуации?

amel27
16-02-2010, 09:25
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 - не знаю. Но подозреваю, что если задам, то русские символы станут нечитаемы и в блакноте)

amel27
16-02-2010, 10:11
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

amel27
16-02-2010, 10:46
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

amel27
16-02-2010, 11:21
Что Вы имеете ввиду? »
для начала вам нужно разобраться какой файл вы должны получить, т.е. иметь пример рабочего 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
То есть видимо он её не перекодирует, но и не понимает... Не зря видать перекодировать пытается....
Самое интересное, что с русскими папками эта прога работает номально.

amel27
16-02-2010, 13:14
taravasya, похоже, dvdauthor работает только с английскими именами в XML-файле... так что - либо искать другую утилиту, либо придумывать алгоритм временного переименования файлов перед их обработкой

taravasya
16-02-2010, 13:40
похоже, dvdauthor работает только с английскими именами в XML-файле... »
Вот этого я и боялся.
либо придумывать алгоритм временного переименования файлов перед их обработкой »
То-есть как бы я не извращался, "родного" имени всё равно не будет? Проблема в том, что видео складывается с нескольких компов, разными пользователями, с разным уровнем подготовки и усидчивости. А значит если кто-то из них забудет что по-русски называть нельзя - всё пойдёт на смарку....
А что на счёт recode? Вы не знаете как с ней работать? Я же её в принципе нашел... но что-то никак не разберусь с синтаксисом.

amel27
16-02-2010, 16:01
То-есть как бы я не извращался, "родного" имени всё равно не будет? »можно переименовать файл(ы), провести обработку и вернуть имя обратно

А что на счёт 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