शेल को कॉल करते समय गलत एन्कोडिंग


9

मैं एक डॉट आरेख के साथ प्रयोग कर रहा था और निम्नलिखित करने की कोशिश कर रहा था:

:! dot -Tpng -oFab.png %

मुझे एक त्रुटि मिली क्योंकि मेरे फ़ाइल नाम में एक विशेष चरित्र है (" ó" फैब्रिकियॉन ")":

C:\windows\system32\cmd.exe /c ( dot -Tpng -oFab.png Fabricaci├│n.gv)
Error: dot: can't open Fabricaci├│n.gv
shell returned 2
Hit any key to close this window...

जैसा कि आप देख सकते हैं, विशेष चरित्र को " ├│" के लिए बदला जा रहा है । यह Win7 और NTFS के तहत vim और gVim 7.4 के साथ है, इसलिए मुझे लगता है कि फ़ाइल नाम UTF16 में है । मैं यह भी मानता हूं कि जब शेल / सीएमडी को इनवॉइस करते हुए फाइलनाम को कुछ अन्य एन्कोडिंग के रूप में व्याख्या की जा रही है ( कोड पृष्ठ 850 में यह चूक करने के लिए कारपेटस्मोकर के लिए धन्यवाद )।

मैं इसे कैसे ठीक करूं?

ज़रूर, मैं बस फ़ाइल का नाम बदल सकता हूं, लेकिन मैं जानना चाहता हूं कि ऐसा क्यों होता है और इसे कैसे ठीक किया जाए।

अपडेट : मुझे यह सवाल सुपरसियर में मिला । एसई (@ क्रिश्चियनब्रैन्डट द्वारा प्रतिक्रिया के लिए धन्यवाद ), लेकिन यह भी मदद नहीं करता है।


1
मुझे उत्सुकता है अगर आपको Cygwin या MobaXterm (Windows के लिए पोर्टेबल यूनिक्स जैसा वातावरण) के तहत कमांड लाइन पर Vim का उपयोग करने में वही त्रुटि मिलेगी। मुझे संदेह नहीं है। वास्तव में इसे ठीक करने का एक तरीका हो सकता है इसलिए विंडोज cmdफ़ाइल नाम को स्वीकार करता है, लेकिन एक यूनिक्स जैसा वातावरण स्थापित करना मेरी पसंदीदा पसंदीदा हैंडलिंग होगी।
वाइल्डकार्ड

2
मैंने जो पढ़ा है, उसके लिए डिफ़ॉल्ट cmd.exeयूनिकोड नहीं है, लेकिन कोड 850 हैइसका उत्तर भी देखें
मार्टिन टूरनोइज

साभार @Carpetsmoker मैंने आपके द्वारा प्रदान की गई जानकारी के साथ अपने प्रश्न को अपडेट करने की स्वतंत्रता ली।
रफ्लो

मैं पूरी तरह से निश्चित नहीं हूं, लेकिन आप 'टर्मेन्कोडिंग' विकल्प को मोड़ सकते हैं।
क्रिश्चियन ब्रेबांट

@ChristianBrabandt जब तक मैं कुछ गलत कर रहा हूँ, मदद करने के लिए प्रतीत नहीं होता है। मैंने tv को lv1, utf8 और cp850 में सेट करने की कोशिश की। किसी को भी चालबाजी नहीं लगती।
रफ्लो

जवाबों:


2

संक्षिप्त जवाब

समस्या में निहित है 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 यूनिकोड फ़ाइल धाराओं का समर्थन करता है।

अफसोस की बात है कि फ़ाइल का नाम बदलने का एकमात्र विकल्प है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.