Kısa cevap
Sorun yatıyor dot.exe
. GraphViz, Visual Studio 2005 ile derlenmedikçe (belki de) Linux'ta Unicode yolları olan dosyaları açabilir, ancak Windows'da açamaz.
Araştırma
Kod sayfası 850
, Vim kodlaması olarak ayarlanır UTF-8
.
Aynı hatayı vermiyor, ancak dot.exe
yanlış bir argüman alıyor gibi görünüyor. Aynı dosya adını diğer programa aktarmayı denedim.
Ve doğru çalıştı. Hem yürütme dot.exe
ve type
doğrudan gelen cmd.exe
aynı sonucu verir Windows Konsol ne de Vim yüzden ne bir sorun. Bu hataya neden olabilecek bir sonraki şey dot.exe
kendisiydi. Şüphem, Unicode kodlu argümanların nasıl düzgün bir şekilde ele alınacağını bilmemesi, tüm konsol komutlarının bile yapmamasıydı:
https://ss64.com/nt/chcp.html
Tam Unicode desteğine ihtiyacınız varsa PowerShell kullanın. CMD kabuğunda Unicode için hala ÇOK sınırlı destek var, borular, yönlendirme ve çoğu komut hala sadece ANSI. Çalışan tek komut DIR, FOR / F ve TYPE'dir, bu da (UTF-16LE / BOM) dosyalarının ve dosya adlarının okunmasına ve yazılmasına izin verir, ancak başka bir şey yapmaz.
GraphViz'de Unicode desteği varsa web'de arama yaptım ve Unicode dosyalarını desteklediğini ancak dosya adları için Unicode desteği hakkında hiçbir şey olmadığını buldum . Ne GraphViz hata izci hakkında herhangi bir rapor buldum ne de Unicode adlı dosyayı okumak isteyen herkes hakkında forumda mesajlar. Bu yüzden kaynağa baktım. İşte dot.exe
giriş noktası neye benziyor:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
Aşağıdaki argv
tavşan deliğine: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];
}
Ve son olarak 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'nin belirttiği gibi:
Fopen fonksiyonu dosya adına göre belirtilen dosyayı açar. _wfopen geniş karakterli versiyonudur Fopen ; _wfopen argümanları geniş karakterli dizelerdir. _wfopen ve fopen aynı şekilde davranırlar. Sadece _wfopen kullanmanın dosya akışında kullanılan kodlanmış karakter kümesi üzerinde hiçbir etkisi yoktur.
Visual C ++ 2005'te, fopen Unicode dosya akışlarını destekler.
Ne yazık ki, orada tek seçenek dosyayı yeniden adlandırmaktır.
cmd
dosya adını kabul eder, ancak Unix benzeri bir ortam kurmak benim tercih ettiğim işlem olacaktır.