Respuesta corta
El problema radica en dot.exe
. GraphViz puede abrir archivos con rutas Unicode en Linux pero no Windows, a menos que (tal vez) si se compila con Visual Studio 2005.
Investigación
La página de códigos está establecida en 850
, Vim codificando en UTF-8
.
No da exactamente el mismo error, pero dot.exe
parece recibir un argumento incorrecto. Intenté pasar el mismo nombre de archivo al otro programa.
Y funcionó a la perfección. Ejecutar ambos dot.exe
y type
directamente desde cmd.exe
el mismo resultado, por lo que ni la consola de Windows ni Vim son el problema. Lo siguiente que pudo causar ese error fue en dot.exe
sí mismo. Mi sospecha era que simplemente no sabe cómo manejar los argumentos codificados Unicode correctamente, ya que ni siquiera todos los comandos de la consola lo hacen:
https://ss64.com/nt/chcp.html
Si necesita soporte completo de Unicode, use PowerShell. Todavía hay soporte MUY limitado para Unicode en el shell de CMD, las tuberías, la redirección y la mayoría de los comandos siguen siendo solo ANSI. Los únicos comandos que funcionan son DIR, FOR / F y TYPE, esto permite leer y escribir (UTF-16LE / BOM) archivos y nombres de archivos, pero no mucho más.
Busqué en la web si hay soporte para Unicode en GraphViz y descubrí que sí admite archivos Unicode pero nada sobre el soporte Unicode para los nombres de archivo. Ni encontré ningún informe en el rastreador de errores GraphViz ni publicaciones en el foro sobre alguien más interesado en leer un archivo con nombre Unicode. Así que lo busqué en la fuente. Aquí se dot.exe
ve el punto de entrada:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
Siguiendo argv
por la madriguera del conejo: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];
}
Y finalmente 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"))) {
. . .
}
Como dice el MDSN:
La función fopen abre el archivo especificado por nombre de archivo. _wfopen es una versión de caracteres anchos de fopen ; Los argumentos de _wfopen son cadenas de caracteres anchos. _wfopen y fopen se comportan de manera idéntica de lo contrario. El simple uso de _wfopen no tiene ningún efecto en el conjunto de caracteres codificados utilizado en la secuencia de archivos.
En Visual C ++ 2005, fopen admite secuencias de archivos Unicode.
Lamentablemente, la única opción es cambiar el nombre del archivo.
cmd
acepte el nombre de archivo, pero instalar un entorno similar a Unix sería mi manejo preferido.