संक्षिप्त जवाब
समस्या में निहित है dot.exe
। GraphViz लिनक्स में यूनिकोड रास्तों के साथ फाइलें खोल सकता है लेकिन विजुअल स्टूडियो 2005 के साथ संकलित होने तक (शायद) विंडोज नहीं।
अनुसंधान
कोड पृष्ठ पर सेट है 850
, विम एन्कोडिंग के लिए UTF-8
।
यह सटीक एक ही त्रुटि नहीं देता है, लेकिन dot.exe
एक गलत तर्क प्राप्त होता है। मैंने उसी फ़ाइलनाम को दूसरे प्रोग्राम में पास करने की कोशिश की।
और यह सही काम किया। दोनों से dot.exe
और type
सीधे से cmd.exe
एक ही परिणाम देता है, इसलिए न तो विंडोज कंसोल और न ही विम समस्या हैं। अगली चीज जो उस त्रुटि का कारण बन सकती है, वह थी dot.exe
। मेरा संदेह यह था कि यह सिर्फ यूनिकोड कोडित तर्कों को ठीक से कैसे संभालना नहीं जानता, क्योंकि सभी कंसोल प्रोग्राम भी नहीं करते हैं:
https://ss64.com/nt/chcp.html
यदि आपको पूर्ण यूनिकोड समर्थन की आवश्यकता है तो PowerShell का उपयोग करें। अभी भी CMD शेल में यूनिकोड के लिए VERY सीमित समर्थन है, पाइपिंग, पुनर्निर्देशन और अधिकांश कमांड अभी भी केवल ANSI हैं। केवल कमांड जो काम करते हैं वे डीआईआर, फॉर / एफ और टाइप हैं, यह पढ़ने और लिखने की अनुमति देता है (UTF-16LE / BOM) फाइलें और फ़ाइल नाम लेकिन बहुत कुछ नहीं।
मैंने वेब पर खोज की अगर ग्राफविज़ में यूनिकोड के लिए समर्थन है और पाया कि यह यूनिकोड फ़ाइलों का समर्थन करता है लेकिन फ़ाइल नाम के लिए यूनिकोड समर्थन के बारे में कुछ भी नहीं है। न तो मुझे ग्राफविज़ बग ट्रैकर पर कोई रिपोर्ट मिली और न ही किसी अन्य के बारे में मंच पर पोस्टों में यूनिकोड नामक फाइल को पढ़ने में रुचि थी। इसलिए मैंने इसे स्रोत में देखा। यहाँ 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 समारोह फ़ाइल नाम के द्वारा निर्दिष्ट फ़ाइल को खोलता है। _wfopen की एक व्यापक चरित्र संस्करण है fopen ; _wfopen के तर्क चौड़े चरित्र के हैं। _wopopen और fopen पहचान का अन्यथा व्यवहार करते हैं। बस _wfopen का उपयोग करने से फ़ाइल स्ट्रीम में उपयोग किए गए कोडित वर्ण पर कोई प्रभाव नहीं पड़ता है।
Visual C ++ 2005 में, fopen यूनिकोड फ़ाइल धाराओं का समर्थन करता है।
अफसोस की बात है कि फ़ाइल का नाम बदलने का एकमात्र विकल्प है।
cmd
फ़ाइल नाम को स्वीकार करता है, लेकिन एक यूनिक्स जैसा वातावरण स्थापित करना मेरी पसंदीदा पसंदीदा हैंडलिंग होगी।