Коротка відповідь
Проблема полягає в тому, що dot.exe
. GraphViz може відкривати файли з контурами Unicode в Linux, але не в Windows, якщо (можливо), якщо вони компільовані з Visual Studio 2005.
Дослідження
На кодовій сторінці встановлено значення 850
, на кодування Vim UTF-8
.
Це не дає точно такої ж помилки, але, dot.exe
схоже, отримує неправильний аргумент. Я спробував передати те саме ім’я файлу іншій програмі.
І це справно працювало. Виконання dot.exe
і type
безпосередньо, і безпосередньо, cmd.exe
дає однаковий результат, тому ні Консоль Windows, ні Vim не є проблемою. Наступне, що могло спричинити цю помилку, - це dot.exe
саме я. Я підозрював, що він просто не знає, як правильно керувати кодованими аргументами Unicode, як це не роблять навіть усі команди консолі:
https://ss64.com/nt/chcp.html
Якщо вам потрібна повна підтримка Unicode, використовуйте PowerShell. Є все ще ДУЖЕ обмежена підтримка Unicode в оболонці CMD, трубопровід, переадресація і більшість команд все ще є лише ANSI. Єдиними командами, які працюють, є DIR, FOR / F і TYPE, це дозволяє читати і записувати (UTF-16LE / BOM) файли та назви файлів, але не багато іншого.
Я шукав в Інтернеті, чи є підтримка Unicode у GraphViz, і виявив, що він підтримує файли Unicode, але нічого про підтримку Unicode для імен файлів. Ні я не знайшов жодних звітів про програму помилок GraphViz, ні публікацій на форумі про тих, хто цікавиться читати файл з іменем Unicode. Тому я подивився це в джерело. Ось як dot.exe
виглядає точка входу:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
Слідом за argv
кролячим отвором:graphviz-2.40.1\lib\common\args.c
int gvParseArgs(GVC_t *gvc, int argc, char** argv)
{
int rv;
if ((argc = neato_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = fdp_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = memtest_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = config_extra_args(gvc, argc, argv)) < 0) return (1-argc);
/* --------------------> HERE GO ALL NON-FLAG ARTUMENTS */
if ((rv = dotneato_args_initialize(gvc, argc, argv))) return rv;
if (Verbose) gvplugin_write_status(gvc);
return 0;
}
graphviz-2.40.1\lib\common\input.c
int dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
{
for (i = 1; i < argc; i++) {
if (argv[i] && argv[i][0] == '-') {
. . .
/* --------------------> JUST CASUALLY COPYING CHAR POINTERS */
} else if (argv[i])
gvc->input_filenames[nfiles++] = argv[i];
}
І остаточно graphviz-2.40.1\lib\common\input.c
graph_t *gvNextInputGraph(GVC_t *gvc)
{
. . . .
/* --------------------> OPENING THE FILES FOR READ WITH FOPEN */
while ((fn = gvc->input_filenames[fidx++]) && !(fp = fopen(fn, "r"))) {
. . .
}
Як зазначає MDSN:
Функція fopen відкриває файл, вказаний ім'ям файлу. _wfopen - це широкоформатна версія fopen ; аргументи до _wfopen - це рядки з широкими символами. _wfopen та fopen ведуть себе однаково інакше. Просто використання _wfopen не впливає на кодований набір символів, який використовується у файловому потоці.
У Visual C ++ 2005, fopen підтримує потоки файлів Unicode.
На жаль, єдиний варіант - перейменувати файл.
cmd
прийняла ім'я файлу, але встановлення подібного до Unix середовища було б моїм власним перевагою.