दरअसल, tasklist
द्वारा उपयोग किया गया वर्णसेट हमेशा सिस्टम डिफ़ॉल्ट से अलग है।
दूसरी ओर, यह जब तक उत्पादन ASCII तक ही सीमित है डिफ़ॉल्ट उपयोग करने के लिए काफी सुरक्षित है। आम तौर पर निष्पादन योग्य मॉड्यूल में उनके नामों में केवल ASCII वर्ण होते हैं।
तो सही स्ट्रिंग्स प्राप्त करने के लिए, आपको (कोड) एएनएसआई) विंडोज कोड पेज को OEM कोड पेज में कनवर्ट करना होगा, और उत्तरार्द्ध को InputStreamReader
पर वर्णमाला के रूप में पास करना होगा।
ऐसा लगता है कि इन एन्कोडिंग के बीच कोई व्यापक मैपिंग नहीं है। निम्नलिखित मानचित्रण इस्तेमाल किया जा सकता:
Map<String, String> ansi2oem = new HashMap<String, String>();
ansi2oem.put("windows-1250", "IBM852");
ansi2oem.put("windows-1251", "IBM866");
ansi2oem.put("windows-1252", "IBM850");
ansi2oem.put("windows-1253", "IBM869");
Charset charset = Charset.defaultCharset();
String streamCharset = ansi2oem.get(charset.name());
if (streamCharset) {
streamCharset = charset.name();
}
InputStreamReader isr = new InputStreamReader(p.getInputStream(),
streamCharset);
यह दृष्टिकोण windows-1251
और IBM866
जोड़ी के साथ मेरे लिए काम किया।
विंडोज द्वारा प्रयोग किया जाता वर्तमान OEM एन्कोडिंग पाने के लिए आपको GetOEMCP
फ़ंक्शन का उपयोग कर सकते हैं।वापसी मान ग़ैर-यूनिकोड प्रोग्रामक्षेत्र में प्रशासनिक टैब और भाषा नियंत्रण कक्ष पर स्थापित करने के लिए भाषा पर निर्भर करता है। परिवर्तन लागू करने के लिए रीबूट की आवश्यकता है। ANSI और OEM:
दो विंडोज पर एन्कोडिंग के प्रकार होते हैं।
पूर्व का उपयोग गैर-यूनिकोड अनुप्रयोगों द्वारा जीयूआई मोड में चल रहा है।
उत्तरार्द्ध कंसोल अनुप्रयोगों द्वारा उपयोग किया जाता है। कंसोल अनुप्रयोग उन वर्णों को प्रदर्शित नहीं कर सकते हैं जिन्हें वर्तमान OEM एन्कोडिंग में प्रदर्शित नहीं किया जा सकता है।
चूंकि tasklist
कंसोल मोड एप्लिकेशन है, इसका आउटपुट हमेशा मौजूदा OEM एन्कोडिंग में होता है।
अंग्रेजी प्रणालियों के लिए, जोड़ी आमतौर पर Windows-1252 और CP850 है।
जैसा कि मैं रूस में हूं, मेरे सिस्टम में निम्नलिखित एन्कोडिंग हैं: Windows-1251 और CP866।
अगर मैं एक फ़ाइल में tasklist
के उत्पादन पर कब्जा, फ़ाइल सही सिरिलिक वर्ण प्रदर्शित नहीं कर सकता: (! हाय)
मैं के बजाय Привет
ЏаЁўҐв
जब नोटपैड में देखी मिलता है।
और µTorrent
зTorrent
के रूप में प्रदर्शित किया गया है।
आप tasklist
द्वारा उपयोग किए गए एन्कोडिंग को नहीं बदल सकते हैं।
हालांकि cmd
के आउटपुट एन्कोडिंग को बदलना संभव है। यदि आप /u
पर स्विच करते हैं, तो यह यूटीएफ -16 एन्कोडिंग में सब कुछ आउटपुट करेगा। Hi
के लिए दो बाइट्स और नई लाइन (\r
और \n
) के लिए दो बाइट्स:
cmd /c echo Hi>echo.txt
echo.txt
का आकार 4 बाइट है।
cmd /u /c echo Hi>echo.txt
अब echo.txt
का आकार 8 बाइट्स: हर किरदार के दो बाइट्स के साथ प्रतिनिधित्व किया है।
क्या कोई प्रश्न है? क्या आपने इसे आजमाया और देखा? –
@JimGarrison मुझे InputStreamReader में * "डिफ़ॉल्ट एन्कोडिंग पर निर्भरता" * के बारे में FindBugs से एक चेतावनी मिली है और मुझे कोई जानकारी नहीं है कि इससे कोई समस्या हो सकती है या नहीं। तो मैंने दूसरी पोस्ट की खोज की और पाया कि ऐसा लगता है कि यह हो सकता है। मैं यही जांचना चाहता हूं। मेरी मशीन पर कोड ठीक काम करता है। – assylias
मैं इसे एक प्रश्न के बजाय टिप्पणी के रूप में जोड़ूंगा क्योंकि मेरी अनिश्चितता काफी बड़ी है। उस ने कहा, मुझे लगता है कि एक सिस्टम उपयोगिता द्वारा उपयोग किया जाने वाला चरित्र सेट ओएस स्थापना के लिए डिफ़ॉल्ट लोकेल का होगा। उस लोकेल के लिए पूछताछ और आउटपुट स्ट्रीम की व्याख्या करने के लिए इसका उपयोग करना सबसे सामान्य दृष्टिकोण प्रतीत होता है। लेकिन यदि स्थानीयकरण भी मौजूद हैं, तो आपको उन क्षेत्रों को रिवर्स-इंजीनियरिंग करना होगा जो उन्हें बदल सकते हैं ताकि उन्हें बाहर निकाला जा सके। और यह सब इस बात पर निर्भर है कि सवाल में उपयोगिता को इस तरह अलग-अलग तरीके से बदलने के लिए लिखा गया था या नहीं। – eh9