Jawaban singkat
Masalahnya terletak pada dot.exe. GraphViz dapat membuka file dengan jalur Unicode di Linux tetapi tidak Windows, kecuali (mungkin) jika dikompilasi dengan Visual Studio 2005.
Penelitian
Halaman kode diatur ke 850, Vim encoding ke UTF-8.

Itu tidak memberikan kesalahan yang sama persis, tetapi dot.exetampaknya menerima argumen yang salah. Saya mencoba meneruskan nama file yang sama ke program lain.

Dan itu bekerja dengan baik. Menjalankan keduanya dot.exedan typelangsung dari cmd.exememberikan hasil yang sama, sehingga baik Windows Console maupun Vim tidak menjadi masalah. Hal berikutnya yang dapat menyebabkan kesalahan itu dot.exesendiri. Kecurigaan saya adalah bahwa ia tidak tahu bagaimana menangani argumen kode Unicode dengan benar, karena tidak semua perintah konsol melakukannya:
https://ss64.com/nt/chcp.html
Jika Anda memerlukan dukungan Unicode penuh, gunakan PowerShell. Masih ada dukungan SANGAT terbatas untuk Unicode di shell CMD, perpipaan, pengalihan dan sebagian besar perintah masih ANSI saja. Satu-satunya perintah yang berfungsi adalah DIR, FOR / F dan TYPE, ini memungkinkan membaca dan menulis file dan nama file (UTF-16LE / BOM) tetapi tidak banyak lagi.
Saya mencari di web jika ada dukungan untuk Unicode di GraphViz dan menemukan bahwa itu mendukung file Unicode tetapi tidak ada tentang dukungan Unicode untuk nama file. Saya tidak menemukan laporan tentang pelacak bug GraphViz atau posting di forum tentang orang lain yang tertarik membaca file bernama Unicode. Jadi saya mencarinya di sumber. dot.exeSeperti apa titik masuknya:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
Mengikuti bagian argvbawah lubang kelinci: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];
}
Dan akhirnya 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"))) {
. . .
}
Seperti yang dinyatakan MDSN:
Fungsi fopen membuka file yang ditentukan oleh nama file. _wfopen adalah versi fopen karakter lebar ; argumen untuk _wfopen adalah string karakter lebar. _wfopen dan fopen berperilaku identik sebaliknya. Cukup menggunakan _wfopen tidak berpengaruh pada set karakter kode yang digunakan dalam aliran file.
Dalam Visual C ++ 2005, fopen mendukung stream file Unicode.
Sayangnya, satu-satunya pilihan di sana adalah mengubah nama file.
cmdmenerima nama file, tetapi menginstal lingkungan seperti Unix akan menjadi pilihan saya sendiri.