Metrolog / marks

Развитие проекта прекращено.
GNU General Public License v3.0
3 stars 1 forks source link

Ошибка при передаче строкового параметра (-sX=СП) из makefile в postscript #75

Closed sergey-s-betke closed 6 years ago

sergey-s-betke commented 6 years ago

Требуемое поведение

Передача должна производиться в корректной кодировке.

Текущее поведение

Сейчас значение уходит в UTF-8, что недопустимо для PostScript.

Необходимо для #69.

sergey-s-betke commented 6 years ago

Видимо, придётся использовать iconv, а на windows - либо PowerShell (а от его массового применения из-за скорости хотелось уйти), либо тот же iconv - но из Cygwin.

Пойду пока таким путём: беру iconv, а затем, если потребуетс, повторю его синтаксис на PowerShell.

sergey-s-betke commented 6 years ago

В общем и целом - есть проблема с передачей кириллических строк из make и из командной строки в ghostscript. И iconv в лоб здесь не подходит.

Проблема, видимо, вообще - в cygwin. Судя по всему, его вина в столь неадекватной перекодировке при передаче строки в ghostscript.

sergey-s-betke commented 6 years ago

Нда. Работа с кириллицей в Cygwin - та ещё песня, судя по результатам поиска... Вполне возможно, что как раз здесь и имеем проблему. На уровне передачи из cygwin приложения make в win64 приложение ghostscript.

sergey-s-betke commented 6 years ago

Да нет. Кириллицу make прекрасно в консоль выводит.

sergey-s-betke commented 6 years ago

Кажется, нашёл корень проблемы.

$(info Тест !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)

выводит текст в консоль нормально, а

$(info $(shell echo Тест !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))

уже с явными проблемами кодировки. А в качестве SHELL у нас установлен PowerShell, однако. Командная строка сейчас уходит в PowerShell, и уже там должна быть исполнена. И на этом переходе возникают проблемы с кодировкой.

Для начала необходимо провести эксперимент на "пустом" makefile с одной командой с передачей кириллицы в ghostscript без подмены SHELL на PowerShell. Без PowerShell проблем быть не должно.

sergey-s-betke commented 6 years ago

Однако, что-то не так. При этом путь к файлу с кириллицей в имени ведь прекрасно передаётся!

sergey-s-betke commented 6 years ago

Да, всё подтвердилось. Простейший файл:

SHELL :=powershell
.SHELLFLAGS = -NoLogo -NonInteractive -ExecutionPolicy unrestricted -Command
$(info $(shell echo Тест!!!!!!!!!!))

уже приводит к проблемам с кодировкой. Без подмены SHELL всё в порядке.

sergey-s-betke commented 6 years ago

Причём проблемы только в том, что прошло через $(shell). Попробуем выяснить, на пути туда или обратно возникают проблемы с кодировкой.

Выяснил. Проблемы возникают при обработке вывода с PowerShell. Даже если передавать через переменные окружения - всё равно проблемы при выводе.

sergey-s-betke commented 6 years ago

Нужен ещё один тест. Уже с ghostscript.

sergey-s-betke commented 6 years ago

Однако, даже без PowerShell проблемы с передачей параметров в PostScript есть:

gswin64c -dBATCH -c "(Тест) ==" (\320\242\320\265\321\201\321\202)

sergey-s-betke commented 6 years ago

Пока вижу один вариант: генерировать сначала postscript сценарии, конвертируя их в CP1251 кодировку, и уже через них генерировать конечные файлы. Потому как при передаче аргументов командной строки в интерпретатор ghostscript проблемы с кодировкой возникают...

sergey-s-betke commented 6 years ago

Для этих целей напрашивается какой-либо шаблонизатор.

sergey-s-betke commented 6 years ago

https://www.gnu.org/software/m4/manual/m4.html

sergey-s-betke commented 6 years ago

Да, для этой задача m4 куда проще и ближе, чем awk.

Но и m4 не поддерживает Unicode. Работает с потоком байт, а не символов. Поэтому обрабатываемый файл, видимо, придётся сначала через iconv конвертировать в какую-либо однобайтовую кодировку (в нашем случае - не потребуется, у нас уже CP1251).

sergey-s-betke commented 6 years ago

Подобный код даёт результат:

C:\Users\sergei.s.betke\Documents\GitHubVisualStudio\marks>m4 -D StampId=СП C:\Users\sergei.s.betke\Documents\GitHubVisualStudio\marks\stamps\mark2image.ps
sergey-s-betke commented 6 years ago

Файл удаётся записать в CP1251 следующим образом:

m4 -D StampId=СП mark2image.ps | iconv -f UTF-8 -t CP1251 > test.ps

Но - из cmd.exe. На bash ещё необходимо тестировать.

sergey-s-betke commented 6 years ago

Однако. А перекодировать собственно makefile в CP1251 не вариант?

sergey-s-betke commented 6 years ago

Изменение кодировки makefile не подходит. При этом получаем проблемы с именами файлов.

sergey-s-betke commented 6 years ago

Возможно, стоит изменить кодировку в консоли перед выполнением ghostscript, командную строку которого сформировать уже в CP1251...

sergey-s-betke commented 6 years ago

Однако... Всё бы неплохо, но при SHELL в PowerShell рецепт

iconv -f CP1251 $$< | m4 -D StampId=$(strip $3) | iconv -t CP1251 > $$@

даёт файл в Unicode.

sergey-s-betke commented 6 years ago

Итого, PowerShell создаёт проблемы с кодировкой при перенаправлении вывода одной "нативной" команды в другую. Видимо, придётся отказываться от PowerShell в качестве SHELL...

sergey-s-betke commented 6 years ago

Вот эта проблема PowerShell, ещё не решена: https://github.com/PowerShell/PowerShell/issues/1908

sergey-s-betke commented 6 years ago

Итого, для решения проблемы придётся обратно слезать с PowerShell. Другого варианта пока не особо вижу. Либо оборачивать в командный файл и вызывать уже командный файл...

Первый вариант нравится уже больше.

sergey-s-betke commented 6 years ago

Итого - слез с PowerShell на bash, передача параметров кириллицей пошла.