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.exe
tampaknya menerima argumen yang salah. Saya mencoba meneruskan nama file yang sama ke program lain.
Dan itu bekerja dengan baik. Menjalankan keduanya dot.exe
dan type
langsung dari cmd.exe
memberikan hasil yang sama, sehingga baik Windows Console maupun Vim tidak menjadi masalah. Hal berikutnya yang dapat menyebabkan kesalahan itu dot.exe
sendiri. 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.exe
Seperti 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 argv
bawah 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.
cmd
menerima nama file, tetapi menginstal lingkungan seperti Unix akan menjadi pilihan saya sendiri.