শেল কল করার সময় ভুল এনকোডিং


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...

আপনি দেখতে পাচ্ছেন, " ├│" এর জন্য বিশেষ চরিত্রটি পরিবর্তন করা হচ্ছে । এটি উইন 7 এবং এনটিএফএসের অধীনে ভিএম এবং জিভিম 7.4 সহ, সুতরাং আমি ধরে নিই যে ফাইলের নামটি ইউটিএফ 16 এ রয়েছে । আমি এটাও ধরে নিয়েছি যে শেল / সেন্টিমিডি করার সময় ফাইলনামটি অন্য কিছু এনকোডিং হিসাবে ব্যাখ্যা করা হচ্ছে ( কোডপেজ 850 এর ডিফল্ট নির্দেশ করার জন্য কার্পেটসোকারকে ধন্যবাদ )।

আমি এটা কিভাবে ঠিক করবো?

অবশ্যই, আমি কেবল ফাইলটির নাম পরিবর্তন করতে পারি, তবে কেন এটি হয় এবং কীভাবে এটি সংশোধন করতে হয় তা জানতে চাই।

আপডেট : আমি সবেমাত্র সুপারসার.এসইতে এই প্রশ্নটি পেয়েছি (@ ক্রিশ্চিয়ান ব্র্যাব্যান্ডের প্রতিক্রিয়ার জন্য ধন্যবাদ ), তবে এটির কোনও সাহায্য করার কথা মনে হয় না।


1
আমি আগ্রহী যদি আপনি সাইগউইন বা মোবাএক্সটার্মের অধীনে (উইন্ডোজের জন্য পোর্টেবল ইউনিক্স-জাতীয় পরিবেশ) এর অধীন কমান্ড লাইনে ভিম ব্যবহার করে একই ত্রুটি পেয়ে থাকেন। আমার সন্দেহ নেই। এটি ঠিক করার কোনও উপায় থাকতে পারে তাই উইন্ডোজ cmdফাইলের নামটি গ্রহণ করে তবে ইউনিক্সের মতো পরিবেশ ইনস্টল করা আমার নিজস্ব পছন্দসই হ্যান্ডলিং হবে।
ওয়াইল্ডকার্ড

2
আমি যা পড়েছি তা থেকে ডিফল্টটি cmd.exeইউনিকোড নয়, কোড পৃষ্ঠা 850এই উত্তরটি দেখুন
মার্টিন টর্নোইজ

ধন্যবাদ @ কার্পেটস্মোকার। আপনার সরবরাহিত তথ্যের সাথে আমি আমার প্রশ্ন আপডেট করার স্বাধীনতা নিয়েছি।
রোফ্লো

আমি পুরোপুরি নিশ্চিত নই, তবে আপনি 'টেরেমিনকোডিং' বিকল্পটি টুইঙ্ক করতে চাইতে পারেন।
খ্রিস্টান ব্র্যাব্যান্ড 18

@ ক্রিশ্চিয়ানব্রাব্যান্ড যদি আমি কিছু ভুল না করি তবে এগুলি সাহায্য করবে বলে মনে হয় না। আমি ল্যাটিন 1, ইউটিএফ 8 এবং সিপি 850 তে টেনকে সেট করার চেষ্টা করেছি। কারও মনে হয় কৌতুক করা হয়নি।
রোফ্লো

উত্তর:


2

সংক্ষিপ্ত উত্তর

সমস্যা নিহিত dot.exe। গ্রাফভিজ লিনাক্সে ইউনিকোড পাথযুক্ত ফাইলগুলি উইন্ডোতে নয়, উইন্ডোজ নয়, খুলতে পারে, যদি না (সম্ভবত) ভিজ্যুয়াল স্টুডিও 2005 এর সাথে সংকলিত হয়।

গবেষণা

কোড পৃষ্ঠাটি সেট করা হয়েছে 850, ভিমে এনকোডিং UTF-8

এখানে চিত্র বর্ণনা লিখুন

এটি ঠিক একই ত্রুটি দেয় না, তবে dot.exeমনে হয় এটি একটি ভুল যুক্তি পেয়েছে। আমি একই ফাইল নামটি অন্য প্রোগ্রামে পাস করার চেষ্টা করেছি।

এখানে চিত্র বর্ণনা লিখুন

এবং এটি ঠিক কাজ করেছে। উভয় dot.exeএবং typeসরাসরি থেকে কার্যকর কার্যকর cmd.exeএকই ফলাফল দেয়, তাই উইন্ডোজ কনসোল বা ভিম উভয়ই সমস্যা নয়। পরবর্তী ত্রুটি যে ত্রুটি সৃষ্টি করতে পারে তা dot.exeনিজেই ছিল । আমার সন্দেহ ছিল যে এটি ইউনিকোড কোডেড যুক্তিগুলি সঠিকভাবে পরিচালনা করতে জানে না, এমনকি সমস্ত কনসোল আদেশও এটি করে না:

https://ss64.com/nt/chcp.html

আপনার যদি ইউনিকোডের পূর্ণ সমর্থন প্রয়োজন হয় তবে পাওয়ারশেল ব্যবহার করুন। সিএমডি শেলটিতে ইউনিকোডের জন্য এখনও খুব সীমিত সমর্থন রয়েছে, পাইপিং, পুনর্নির্দেশ এবং বেশিরভাগ কমান্ডগুলি কেবলমাত্র এএনএসআই। কেবল কমান্ডগুলি ডিআইআর, ফর / এফ এবং টিওয়াইপি, এটি পড়তে এবং লেখার (ইউটিএফ-16 এল / বিওএম) ফাইল এবং ফাইলের নাম দেয় তবে অন্য কিছু নয়।

আমি ওয়েবে অনুসন্ধান করেছি যদি গ্রাফভিজে ইউনিকোডের জন্য সমর্থন থাকে এবং আমি দেখতে পেলাম যে এটি ইউনিকোড ফাইলগুলিকে সমর্থন করে তবে ফাইল নামগুলির জন্য ইউনিকোড সমর্থন সম্পর্কে কিছুই নয়। গ্রাফিক ভিগ বাগ ট্র্যাকারে বা ফোরামের কোনও পোস্টই আমি খুঁজে পাইনি বা ইউনিকোড নামের ফাইলটি পড়তে আগ্রহী বলে অন্য কেউ ফোরামে পোস্টও পাইনি। সুতরাং আমি উত্স এ এটি তাকান। এখানে 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")))  {

        . . .

    }

এমডিএসএন যেমন বলেছে:

হয় fopen ফাংশন ফাইলের নাম দ্বারা নির্বাচিত ফাইল খোলে। _wfopen ব্যাপক-অক্ষর সংস্করণ হয় fopen ; _ওয়োফেন - এ যুক্তিগুলি প্রশস্ত-অক্ষরের স্ট্রিং। _উপ্পেন এবং ফপেন অন্যভাবে অভিন্ন আচরণ করে। কেবলমাত্র _Wfopen ব্যবহারের ফলে ফাইল স্ট্রমে ব্যবহৃত কোডড অক্ষর সেটটিতে কোনও প্রভাব নেই।

ভিজ্যুয়াল সি ++ 2005-এ, ফোপেন ইউনিকোড ফাইল স্ট্রিম সমর্থন করে।

দুঃখের বিষয়, কেবলমাত্র বিকল্পটি ফাইলটির নাম পরিবর্তন করা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.