简短答案
问题出在dot.exe
。GraphViz可以在Linux中打开带有Unicode路径的文件,但不能在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。在CMD Shell中,对Unicode的支持仍然非常有限,管道,重定向和大多数命令仍然仅是ANSI。唯一有效的命令是DIR,FOR / F和TYPE,这允许读取和写入(UTF-16LE / BOM)文件和文件名,但没有其他内容。
我在网上搜索了GraphViz中是否支持Unicode,发现它确实支持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函数打开由filename指定的文件。_wfopen是fopen的宽字符版本;_wfopen的参数是宽字符字符串。否则,_wfopen和fopen的行为相同。简单地使用_wfopen对文件流中使用的编码字符集没有影响。
在Visual C ++ 2005中,fopen支持Unicode文件流。
可悲的是,唯一的选择是重命名文件。
cmd
接受文件名,但是我喜欢安装类似Unix的环境。