Kurze Antwort
Das Problem liegt in dot.exe
. GraphViz kann Dateien mit Unicode-Pfaden unter Linux öffnen, jedoch nicht unter Windows, es sei denn (möglicherweise), wenn es mit Visual Studio 2005 kompiliert wurde.
Forschung
Die Codepage ist auf 850
Vim-Codierung eingestellt UTF-8
.
Es gibt nicht genau den gleichen Fehler, aber der dot.exe
scheint ein falsches Argument zu erhalten. Ich habe versucht, den gleichen Dateinamen an das andere Programm zu übergeben.
Und es hat genau richtig funktioniert. Das Ausführen von beiden dot.exe
und type
direkt von cmd.exe
führt zu demselben Ergebnis, sodass weder die Windows-Konsole noch Vim das Problem sind. Das nächste, was diesen Fehler verursachen konnte, war sich dot.exe
selbst. Mein Verdacht war, dass es einfach nicht weiß, wie man mit den Unicode-codierten Argumenten richtig umgeht, wie es nicht einmal alle Konsolenbefehle tun:
https://ss64.com/nt/chcp.html
Wenn Sie vollständige Unicode-Unterstützung benötigen, verwenden Sie PowerShell. Es gibt immer noch SEHR eingeschränkte Unterstützung für Unicode in der CMD-Shell, Piping, Umleitung und die meisten Befehle sind immer noch nur ANSI. Die einzigen Befehle, die funktionieren, sind DIR, FOR / F und TYPE. Dies ermöglicht das Lesen und Schreiben von (UTF-16LE / BOM) Dateien und Dateinamen, aber sonst nicht viel.
Ich habe im Web gesucht, ob Unicode in GraphViz unterstützt wird, und festgestellt, dass es Unicode- Dateien unterstützt, aber nichts über die Unicode-Unterstützung für die Dateinamen. Weder habe ich Berichte über den GraphViz-Bug-Tracker noch Beiträge im Forum über andere Personen gefunden, die daran interessiert sind, eine Unicode-Datei mit dem Namen zu lesen. Also habe ich es in der Quelle nachgeschlagen. Hier dot.exe
sieht der Einstiegspunkt aus:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
Folgen argv
Sie dem Kaninchenbau: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];
}
Und schließlich 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"))) {
. . .
}
Wie der MDSN feststellt:
Die Funktion fopen öffnet die durch den Dateinamen angegebene Datei. _wfopen ist eine Version von fopen mit breiten Zeichen . Die Argumente für _wfopen sind Zeichenfolgen mit breiten Zeichen. _wfopen und fopen verhalten sich ansonsten identisch. Die einfache Verwendung von _wfopen hat keine Auswirkung auf den im Dateistream verwendeten codierten Zeichensatz.
In Visual C ++ 2005 unterstützt fopen Unicode-Dateistreams.
Leider besteht die einzige Möglichkeit darin, die Datei umzubenennen.
cmd
den Dateinamen akzeptiert. Die Installation einer Unix-ähnlichen Umgebung wäre jedoch meine bevorzugte Vorgehensweise.