Closed sergey-s-betke closed 6 years ago
Видимо, придётся использовать iconv
, а на windows - либо PowerShell (а от его массового применения из-за скорости хотелось уйти), либо тот же iconv - но из Cygwin.
Пойду пока таким путём: беру iconv
, а затем, если потребуетс, повторю его синтаксис на PowerShell.
В общем и целом - есть проблема с передачей кириллических строк из make и из командной строки в ghostscript. И iconv в лоб здесь не подходит.
Проблема, видимо, вообще - в cygwin. Судя по всему, его вина в столь неадекватной перекодировке при передаче строки в ghostscript.
Нда. Работа с кириллицей в Cygwin - та ещё песня, судя по результатам поиска... Вполне возможно, что как раз здесь и имеем проблему. На уровне передачи из cygwin приложения make в win64 приложение ghostscript.
Да нет. Кириллицу make прекрасно в консоль выводит.
Кажется, нашёл корень проблемы.
$(info Тест !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
выводит текст в консоль нормально, а
$(info $(shell echo Тест !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))
уже с явными проблемами кодировки. А в качестве SHELL у нас установлен PowerShell, однако. Командная строка сейчас уходит в PowerShell, и уже там должна быть исполнена. И на этом переходе возникают проблемы с кодировкой.
Для начала необходимо провести эксперимент на "пустом" makefile с одной командой с передачей кириллицы в ghostscript без подмены SHELL на PowerShell. Без PowerShell проблем быть не должно.
Однако, что-то не так. При этом путь к файлу с кириллицей в имени ведь прекрасно передаётся!
Да, всё подтвердилось. Простейший файл:
SHELL :=powershell
.SHELLFLAGS = -NoLogo -NonInteractive -ExecutionPolicy unrestricted -Command
$(info $(shell echo Тест!!!!!!!!!!))
уже приводит к проблемам с кодировкой. Без подмены SHELL
всё в порядке.
Причём проблемы только в том, что прошло через $(shell)
. Попробуем выяснить, на пути туда или обратно возникают проблемы с кодировкой.
Выяснил. Проблемы возникают при обработке вывода с PowerShell. Даже если передавать через переменные окружения - всё равно проблемы при выводе.
Нужен ещё один тест. Уже с ghostscript.
Однако, даже без PowerShell проблемы с передачей параметров в PostScript есть:
gswin64c -dBATCH -c "(Тест) ==" (\320\242\320\265\321\201\321\202)
Пока вижу один вариант: генерировать сначала postscript сценарии, конвертируя их в CP1251 кодировку, и уже через них генерировать конечные файлы. Потому как при передаче аргументов командной строки в интерпретатор ghostscript проблемы с кодировкой возникают...
Для этих целей напрашивается какой-либо шаблонизатор.
Да, для этой задача m4
куда проще и ближе, чем awk
.
Но и m4
не поддерживает Unicode. Работает с потоком байт, а не символов. Поэтому обрабатываемый файл, видимо, придётся сначала через iconv
конвертировать в какую-либо однобайтовую кодировку (в нашем случае - не потребуется, у нас уже CP1251).
Подобный код даёт результат:
C:\Users\sergei.s.betke\Documents\GitHubVisualStudio\marks>m4 -D StampId=СП C:\Users\sergei.s.betke\Documents\GitHubVisualStudio\marks\stamps\mark2image.ps
Файл удаётся записать в CP1251 следующим образом:
m4 -D StampId=СП mark2image.ps | iconv -f UTF-8 -t CP1251 > test.ps
Но - из cmd.exe. На bash ещё необходимо тестировать.
Однако. А перекодировать собственно makefile в CP1251 не вариант?
Изменение кодировки makefile не подходит. При этом получаем проблемы с именами файлов.
Возможно, стоит изменить кодировку в консоли перед выполнением ghostscript, командную строку которого сформировать уже в CP1251...
Однако... Всё бы неплохо, но при SHELL
в PowerShell рецепт
iconv -f CP1251 $$< | m4 -D StampId=$(strip $3) | iconv -t CP1251 > $$@
даёт файл в Unicode.
Итого, PowerShell создаёт проблемы с кодировкой при перенаправлении вывода одной "нативной" команды в другую. Видимо, придётся отказываться от PowerShell в качестве SHELL...
Вот эта проблема PowerShell, ещё не решена: https://github.com/PowerShell/PowerShell/issues/1908
Итого, для решения проблемы придётся обратно слезать с PowerShell. Другого варианта пока не особо вижу. Либо оборачивать в командный файл и вызывать уже командный файл...
Первый вариант нравится уже больше.
Итого - слез с PowerShell на bash, передача параметров кириллицей пошла.
Требуемое поведение
Передача должна производиться в корректной кодировке.
Текущее поведение
Сейчас значение уходит в UTF-8, что недопустимо для PostScript.
Необходимо для #69.