2008-10-15 16 views
5

में छद्म-लोक (यूनिकोड) तारों को रीडायरेक्ट करना मैं एक कंसोल ऐप (myApp.exe) चला रहा हूं जो मानक आउटपुट में छद्म स्थानीयकृत (यूनिकोड) स्ट्रिंग आउटपुट करता है। यदि मैं इसे नियमित कमांड प्रॉम्प्ट (cmd.exe) में चलाता हूं, तो यूनिकोड डेटा खो जाता है। यदि मैं इसे यूनिकोड कमांड प्रॉम्प्ट (cmd.exe/u) में चलाता हूं या कंसोल के गुणों को "लुसीडा कंसोल" पर सेट करता हूं तो यूनिकोड स्ट्रिंग को बनाए रखा जाता है।कंसोल आउटपुट को पुनर्निर्देशित करना सी #

मैं इस ऐप को सी # में चलाने के लिए और यूनिकोड स्ट्रिंग को स्थानीय चर में रीडायरेक्ट करना चाहता हूं। मैं RedirectStandardOutput = true के साथ एक प्रक्रिया ऑब्जेक्ट का उपयोग कर रहा हूं, लेकिन यूनिकोड स्ट्रिंग हमेशा खो जाती है।

मैं इस यूनिकोड जानकारी को जारी रखने के लिए कैसे निर्दिष्ट कर सकता हूं?

 private static int RunDISM(string Args, out string ConsoleOutput) 
     { 
      Process process = new Process(); 
      process.StartInfo.FileName = "myApp.exe"; 
      process.StartInfo.Arguments = Args; 

      try 
      { 
       process.StartInfo.CreateNoWindow = true; 
       process.StartInfo.UseShellExecute = false; 
       process.StartInfo.RedirectStandardOutput = true; 
       process.StartInfo.WorkingDirectory = Environment.CurrentDirectory; 

       process.Start(); 
       process.WaitForExit(Int32.MaxValue); 
      } 
      catch (Exception e) 
      { 
       WEX.Logging.Interop.Log.Assert("Failure while starting or running process.\nERROR: " + e.Message); 
       ConsoleOutput = null; 
       return EXITCODE_ERROR; 
      } 

      ConsoleOutput = process.StandardOutput.ReadToEnd(); 
      return process.ExitCode; 
     } 
+0

क्या आप हमें myApp.exe से बाहर निकलने की कोशिश कर रहे यूनिकोड सामग्री पर अधिक जानकारी प्रदान कर सकते हैं, विशेष रूप से नमूना स्ट्रिंग जो ठीक से नहीं आ रहा है? इससे हमें एक समाधान समाधान में मदद मिल सकती है। – Charlie

+0

एक और नोट पर: आपको WaitToExit() से पहले ReadToEnd() को कॉल करना चाहिए। देखें: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx – Ben

उत्तर

3

ऐसा लगता है कि अपने कंसोल app से StandardOutput धारा पर एन्कोडिंग बदलने के लिए, ProcessStartInfo पर StandardOutputEncoding संपत्ति का उपयोग कर की जरूरत है। प्रक्रिया शुरू करने से पहले, अपने आज़माएं/कैच ब्लॉक के अंदर निम्नलिखित कोड जोड़ने का प्रयास करें:

process.StartInfo.StandardOutputEncoding = Encoding.Unicode; 

आप विभिन्न एन्कोडिंग के साथ प्रयोग करने को देखने के लिए जो अपने मामले के लिए सही एक है हो सकता है।

+1

मैंने सभी एन्कोडिंग का प्रयास किया है और डेटा हमेशा खो जाता है या गलत तरीके से प्रस्तुत किया जाता है। :( – Kenn

+0

क्या आपका मतलब मानक इनपुट एन्कोडिंग नहीं है? यदि myApp.exe "यूनिकोड" उत्सर्जित कर रहा है (जो भी इस संदर्भ में है) तो यह एप्लिकेशन myApp.exe चला रहा है जिसे सही तरीके से पार्स करने का प्रयास करना चाहिए। – bzlm

+0

सोचने का तरीका यह है कि मानकऑटपुट एक धारा है जिसे सी # ऐप से पढ़ा जा रहा है। यह स्ट्रीम उस डेटा को शामिल करती है जो myApp अपने स्वयं के stdout पर लिखता है। चूंकि डेटा यूनिकोड रूप में होगा, इसलिए स्ट्रीम को इसके एन्कोडिंग सेट की आवश्यकता होती है। – Charlie

2

बाइट्स हट जाओ और अगर वे कोई मतलब देखें:

var b = p.StandardOutput.CurrentEncoding.GetBytes(p.StandardOutput.ReadToEnd()); 

एक बार जब आप वास्तविक एन्कोडिंग पता लगा आप standard encoding APIs उपयोग कर सकते हैं एक स्ट्रिंग में बाइट्स कन्वर्ट करने के लिए।

संबंधित मुद्दे