Cmd.exe किस एन्कोडिंग / कोड पेज का उपयोग कर रहा है?


271

जब मैं विंडोज में cmd.exe खोलता हूं, तो यह किस एन्कोडिंग का उपयोग कर रहा है?

मैं वर्तमान में उपयोग कर रहे एन्कोडिंग को कैसे देख सकता हूँ? क्या यह मेरी क्षेत्रीय सेटिंग पर निर्भर करता है या जाँच के लिए कोई पर्यावरण चर हैं?

जब आप किसी फ़ाइल को एक निश्चित एन्कोडिंग के साथ टाइप करते हैं तो क्या होता है? कभी-कभी मुझे गंदे अक्षर मिलते हैं (गलत एन्कोडिंग का उपयोग किया जाता है) और कभी-कभी यह काम करता है। हालाँकि मुझे कुछ भी भरोसा नहीं है क्योंकि मुझे नहीं पता कि क्या चल रहा है। क्या कोई समझा सकता है?

जवाबों:


389

हां, यह निराशाजनक है- कभी-कभी typeऔर अन्य कार्यक्रम अस्पष्ट होते हैं, और कभी-कभी वे नहीं करते हैं।

सबसे पहले, यूनिकोड वर्ण केवल प्रदर्शित करेगा यदि वर्तमान कंसोल फ़ॉन्ट में वर्ण हैं । इसलिए डिफ़ॉल्ट Raster फ़ॉन्ट के बजाय Lucida Console जैसे ट्रू टाइप फ़ॉन्ट का उपयोग करें।

लेकिन यदि कंसोल फ़ॉन्ट में वह चरित्र नहीं है जिसे आप प्रदर्शित करने का प्रयास कर रहे हैं, तो आपको जिबरिश के बजाय प्रश्न चिह्न दिखाई देंगे। जब आप अस्पष्ट हो जाते हैं, तो फॉन्ट सेटिंग्स की तुलना में अधिक चल रहा है।

जब प्रोग्राम मानक सी-लाइब्रेरी I / O फ़ंक्शन का उपयोग करते हैं printf, जैसे कि प्रोग्राम का आउटपुट एन्कोडिंग कंसोल के आउटपुट एन्कोडिंग से मेल खाना चाहिए , या आपको जीब्रीश मिलेगा। chcpवर्तमान कोडपृष्ठ दिखाता और सेट करता है। मानक सी-लाइब्रेरी I / O फ़ंक्शन का उपयोग करने वाले सभी आउटपुट को इस तरह से व्यवहार किया जाता है जैसे कि यह प्रदर्शित किए गए कोडपेज में है chcp

कंसोल के आउटपुट एन्कोडिंग के साथ प्रोग्राम के आउटपुट एन्कोडिंग का मिलान दो अलग-अलग तरीकों से किया जा सकता है:

  • एक प्रोग्राम कंसोल के वर्तमान कोडपेज का उपयोग करके chcpया GetConsoleOutputCPउस एन्कोडिंग में आउटपुट के लिए कॉन्फ़िगर कर सकता है, या

  • आप या प्रोग्राम का उपयोग करके chcpया SetConsoleOutputCPप्रोग्राम के डिफ़ॉल्ट आउटपुट एन्कोडिंग से मिलान करने के लिए कंसोल के वर्तमान कोडपेज को सेट कर सकते हैं ।

हालाँकि, Win32 API का उपयोग करने वाले प्रोग्राम UTF-16LE स्ट्रिंग्स को सीधे कंसोल से लिख सकते हैं WriteConsoleW। कोडपे को सेट किए बिना सही आउटपुट प्राप्त करने का यह एकमात्र तरीका है। और उस फ़ंक्शन का उपयोग करते समय, यदि कोई स्ट्रिंग UTF-16LE एन्कोडिंग के साथ शुरू करने के लिए नहीं है, तो Win32 प्रोग्राम को सही कोडपेज को पास करना होगा MultiByteToWideChar। इसके अलावा,WriteConsoleW कार्यक्रम के आउटपुट को पुनर्निर्देशित करने पर काम नहीं करेगा; उस मामले में और अधिक निपुणता की आवश्यकता है।

typeकुछ समय के लिए काम करता है क्योंकि यह UTF-16LE बाइट ऑर्डर मार्क (BOM) के लिए प्रत्येक फ़ाइल की शुरुआत की जाँच करता है , यानी बाइट्स 0xFF 0xFE। यदि यह ऐसा चिह्न पाता है, तो यह WriteConsoleW वर्तमान कोडपेज की परवाह किए बिना फ़ाइल में यूनिकोड वर्ण प्रदर्शित करता है । लेकिन जब typeकोई फ़ाइल बिना UTF-16LE BOM के या किसी भी कमांड के साथ गैर-ASCII वर्णों का उपयोग करने के लिए जो कॉल नहीं करता है, तो WriteConsoleWआपको एक-दूसरे से मिलान करने के लिए कंसोल कोडपेज और प्रोग्राम आउटपुट एन्कोडिंग सेट करने की आवश्यकता होगी।


हम इसका पता कैसे लगा सकते हैं?

यहां एक परीक्षण फ़ाइल है जिसमें यूनिकोड वर्ण हैं:

ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

विभिन्न यूनिकोड एनकोडिंग के एक समूह में परीक्षण फ़ाइल को प्रिंट करने के लिए यहां जावा प्रोग्राम है। यह किसी भी प्रोग्रामिंग भाषा में हो सकता है; यह केवल ASCII वर्ण या एन्कोडेड बाइट को प्रिंट करता है stdout

import java.io.*;

public class Foo {

    private static final String BOM = "\ufeff";
    private static final String TEST_STRING
        = "ASCII     abcde xyz\n"
        + "German    äöü ÄÖÜ ß\n"
        + "Polish    ąęźżńł\n"
        + "Russian   абвгдеж эюя\n"
        + "CJK       你好\n";

    public static void main(String[] args)
        throws Exception
    {
        String[] encodings = new String[] {
            "UTF-8", "UTF-16LE", "UTF-16BE", "UTF-32LE", "UTF-32BE" };

        for (String encoding: encodings) {
            System.out.println("== " + encoding);

            for (boolean writeBom: new Boolean[] {false, true}) {
                System.out.println(writeBom ? "= bom" : "= no bom");

                String output = (writeBom ? BOM : "") + TEST_STRING;
                byte[] bytes = output.getBytes(encoding);
                System.out.write(bytes);
                FileOutputStream out = new FileOutputStream("uc-test-"
                    + encoding + (writeBom ? "-bom.txt" : "-nobom.txt"));
                out.write(bytes);
                out.close();
            }
        }
    }
}

डिफ़ॉल्ट कोडपेज में आउटपुट? कुल कचरा!

Z:\andrew\projects\sx\1259084>chcp
Active code page: 850

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
= bom
´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 = bom
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
 == UTF-16BE
= no bom
 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
= bom
■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}
== UTF-32LE
= no bom
A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   = bom
 ■  A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y
   == UTF-32BE
= no bom
   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}
= bom
  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

हालांकि, क्या होगा अगर हम typeफाइलें जो सहेजे गए हैं? उनमें ठीक उसी बाइट्स होते हैं जो कंसोल पर प्रिंट किए गए थे।

Z:\andrew\projects\sx\1259084>type *.txt

uc-test-UTF-16BE-bom.txt


■  A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16BE-nobom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h        ☺♣☺↓☺z☺|☺D☺B
 R u s s i a n      ♦0♦1♦2♦3♦4♦5♦6  ♦M♦N♦O
 C J K              O`Y}

uc-test-UTF-16LE-bom.txt


ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

uc-test-UTF-16LE-nobom.txt


A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y

uc-test-UTF-32BE-bom.txt


  ■    A   S   C   I   I                       a   b   c   d   e       x   y   z

   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32BE-nobom.txt


   A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                  ☺♣  ☺↓  ☺z  ☺|  ☺D  ☺B
   R   u   s   s   i   a   n              ♦0  ♦1  ♦2  ♦3  ♦4  ♦5  ♦6      ♦M  ♦N
  ♦O
   C   J   K                              O`  Y}

uc-test-UTF-32LE-bom.txt


 A S C I I           a b c d e   x y z
 G e r m a n         ä ö ü   Ä Ö Ü   ß
 P o l i s h         ą ę ź ż ń ł
 R u s s i a n       а б в г д е ж   э ю я
 C J K               你 好

uc-test-UTF-32LE-nobom.txt


A   S   C   I   I                       a   b   c   d   e       x   y   z
   G   e   r   m   a   n                   õ   ÷   ³       ─   Í   ▄       ▀
   P   o   l   i   s   h                   ♣☺  ↓☺  z☺  |☺  D☺  B☺
   R   u   s   s   i   a   n               0♦  1♦  2♦  3♦  4♦  5♦  6♦      M♦  N
♦  O♦
   C   J   K                               `O  }Y

uc-test-UTF-8-bom.txt


´╗┐ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

uc-test-UTF-8-nobom.txt


ASCII     abcde xyz
German    ├ñ├Â├╝ ├ä├û├£ ├ƒ
Polish    ąęźżńł
Russian   ð░ð▒ð▓ð│ð┤ðÁð ÐìÐÄÐÅ
CJK       õ¢áÕÑ¢

केवल बात यह है कि काम करता है UTF-16LE फ़ाइल एक बीओएम, के माध्यम से कंसोल के लिए मुद्रित के साथ है type

यदि हम typeफ़ाइल को प्रिंट करने के अलावा किसी और चीज का उपयोग करते हैं, तो हमें कचरा मिलता है:

Z:\andrew\projects\sx\1259084>copy uc-test-UTF-16LE-bom.txt CON
 ■A S C I I           a b c d e   x y z
 G e r m a n         õ ÷ ³   ─ Í ▄   ▀
 P o l i s h         ♣☺↓☺z☺|☺D☺B☺
 R u s s i a n       0♦1♦2♦3♦4♦5♦6♦  M♦N♦O♦
 C J K               `O}Y
         1 file(s) copied.

इस तथ्य से कि copy CONयूनिकोड को सही ढंग से प्रदर्शित नहीं किया गया है, हम यह निष्कर्ष निकाल सकते हैं कि typeकमांड में फ़ाइल की शुरुआत में UTF-16LE BOM का पता लगाने के लिए तर्क है, और इसे प्रिंट करने के लिए विशेष विंडोज एपीआई का उपयोग करें।

हम cmd.exeइसे डिबगर में खोलकर देख सकते हैं जब यह type एक फ़ाइल को बाहर जाता है :

यहां छवि विवरण दर्ज करें

typeएक फ़ाइल खोलने के बाद , यह एक बीओआई के लिए जाँच करता है 0xFEFF, 0xFF 0xFEथोड़ा-एंडियन में बाइट्स - और अगर ऐसा कोई बॉम है, तो typeएक आंतरिक fOutputUnicodeध्वज सेट करता है । यह ध्वज बाद में जांचा जाता है कि क्या कॉल करना है WriteConsoleW

लेकिन यह typeयूनिकोड को प्राप्त करने का एकमात्र तरीका है , और केवल उन फ़ाइलों के लिए जिनके पास BOMs हैं और UTF-16LE में हैं। अन्य सभी फ़ाइलों के लिए, और उन प्रोग्रामों के लिए, जिनके पास कंसोल आउटपुट को संभालने के लिए विशेष कोड नहीं है, आपकी फ़ाइलों की वर्तमान कोडपेज के अनुसार व्याख्या की जाएगी, और संभवतः यह अस्पष्ट रूप में दिखाई देगा।

आप अनुकरण कर सकते हैं कि typeयूनिकोड को अपने स्वयं के कार्यक्रमों में कंसोल के लिए कैसे आउटपुट करता है:

#include <stdio.h>
#define UNICODE
#include <windows.h>

static LPCSTR lpcsTest =
    "ASCII     abcde xyz\n"
    "German    äöü ÄÖÜ ß\n"
    "Polish    ąęźżńł\n"
    "Russian   абвгдеж эюя\n"
    "CJK       你好\n";

int main() {
    int n;
    wchar_t buf[1024];

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    n = MultiByteToWideChar(CP_UTF8, 0,
            lpcsTest, strlen(lpcsTest),
            buf, sizeof(buf));

    WriteConsole(hConsole, buf, n, &n, NULL);

    return 0;
}

यह प्रोग्राम डिफ़ॉल्ट कोडपेज का उपयोग करके विंडोज कंसोल पर यूनिकोड को प्रिंट करने के लिए काम करता है।


नमूना जावा प्रोग्राम के लिए, हम कोडपेज को मैन्युअल रूप से सेट करके थोड़ा सही आउटपुट प्राप्त कर सकते हैं, हालांकि आउटपुट अजीब स्थिति में गड़बड़ हो जाता है:

Z:\andrew\projects\sx\1259084>chcp 65001
Active code page: 65001

Z:\andrew\projects\sx\1259084>java Foo
== UTF-8
= no bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
ж эюя
CJK       你好
 你好
好
�
= bom
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好
еж эюя
CJK       你好
  你好
好
�
== UTF-16LE
= no bom
A S C I I           a b c d e   x y z
…

हालाँकि, एक C प्रोग्राम जो यूनिकोड UTF-8 कोडपेज सेट करता है:

#include <stdio.h>
#include <windows.h>

int main() {
    int c, n;
    UINT oldCodePage;
    char buf[1024];

    oldCodePage = GetConsoleOutputCP();
    if (!SetConsoleOutputCP(65001)) {
        printf("error\n");
    }

    freopen("uc-test-UTF-8-nobom.txt", "rb", stdin);
    n = fread(buf, sizeof(buf[0]), sizeof(buf), stdin);
    fwrite(buf, sizeof(buf[0]), n, stdout);

    SetConsoleOutputCP(oldCodePage);

    return 0;
}

सही आउटपुट है:

Z:\andrew\projects\sx\1259084>.\test
ASCII     abcde xyz
German    äöü ÄÖÜ ß
Polish    ąęźżńł
Russian   абвгдеж эюя
CJK       你好

कहानी का नैतिक पहलू है?

  • type अपने वर्तमान कोड पृष्ठ की परवाह किए बिना BOM के साथ UTF-16LE फ़ाइलों को प्रिंट कर सकते हैं
  • Win32 प्रोग्राम को यूनिकोड को कंसोल में आउटपुट करने के लिए प्रोग्राम किया जा सकता है, का उपयोग करके WriteConsoleW
  • अन्य प्रोग्राम जो कोडपेज को सेट करते हैं और तदनुसार अपने आउटपुट एन्कोडिंग को समायोजित करते हैं, इस बात की परवाह किए बिना कि कोडपेज क्या था, तब यूनिकोड को कंसोल पर प्रिंट कर सकते हैं।
  • बाकी सभी चीजों के लिए आपको गड़बड़ करना chcpहोगा, और शायद अभी भी अजीब आउटपुट मिलेगा।

73
वाह, यह सबसे विस्तृत जवाब होगा जो मैंने एसओ पर कभी देखा है। असंतुष्ट प्रिंट और बहुभाषी कौशल के लिए अतिरिक्त ऋण! बस सुंदर है, सर!
१irst:५

2
कोई भी Microsoft विशिष्ट एक्सटेंशन _setmode (_fileno (stdout), _O_U16TEXT) का अध्ययन करना चाहता है, जिसे VS2008 में पेश किया गया था। देखें stackoverflow.com/a/9051543 , और stackoverflow.com/a/12015918 , और msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.90).aspx () _setmode के बीच स्पष्ट मतभेद पोर्टेबिलिटी इसके अलावा और SetConsoleOutputCP (), दोनों दृष्टिकोणों में छिपी अन्य सूक्ष्मताएं और दुष्प्रभाव भी हो सकते हैं जो पहली नज़र में पूरी तरह से समझ में नहीं आते हैं। अगर andrewdotn _setmode (fd, _O_U16TEXT) के बारे में किसी भी टिप्पणियों के साथ अपने जवाब को अपडेट कर सकता है, तो यह बहुत अच्छा होगा।
जसदेव

13
हालांकि यह एक उत्कृष्ट उत्तर है, यह कहना भ्रामक है कि कंसोल UTF-16 का समर्थन करता है। यह UCS-2 तक सीमित है, यानी मूल बहुभाषी विमान (BMP) में वर्णों तक सीमित है। जब Win32 कंसोल सर्वर (conhost.exe, आजकल) को लगभग 1990 में डिज़ाइन किया गया था, तो यूनिकोड एक 16-बिट मानक था, इसलिए कंसोल स्क्रीन बफर एक 16-बिट WCHAR प्रति चरित्र सेल का उपयोग करता है। एक UTF-16 सरोगेट जोड़ी दो बॉक्स पात्रों के रूप में प्रिंट करती है।
एरिक सन

3
@ user200783, विघटित रूप समर्थित नहीं है; आम तौर पर एक एनएफसी समकक्ष में बदल सकता है। इसके अलावा, पश्चिमी स्थानों में कंसोल पूर्ण-चौड़ाई और अर्ध-चौड़ाई वाले ग्लिफ़ को मिलाने की अनुमति नहीं देता है। इसके अलावा, जब कोड 865001 (UTF-8) का उपयोग करते हुए, विंडोज 8 से पहले WriteFileबाइट्स की संख्या के बजाय लिखे गए वर्णों की संख्या की रिपोर्ट की जाती है, तो बफ़र किए गए लेखक गैर-ASIIII वर्णों की संख्या के अनुपात में 'बचे हुए' बाइट्स को कई बार पुनः प्राप्त करते हैं। । इसके अलावा 65001 में, गैर-एएससीआईआई अक्षरों को पढ़ना कॉनहस्टी। Exe में विफल रहता है क्योंकि यह कॉल करते समय प्रति UTF-16 कोड में 1 ANSI बाइट मानता है WideCharToMultiByte
इरीक सन

2
इस उत्तर में सरल डेमो प्रोग्राम मान लेते हैं कि GetStdHandle(STD_OUTPUT_HANDLE)और C stdoutकंसोल हैंडल हैं। अभ्यास में, कंसोल के लिए परीक्षण करने के लिए, जांचें कि GetConsoleModeसफल होता है। यह भी _isattyजाँचने के लिए C रनटाइम फ़ंक्शन का उपयोग न करें कि क्या कम I / O फ़ाइल डिस्क्रिप्टर कंसोल है; वह सिर्फ एक चरित्र-मोड डिवाइस की जांच करता है, जिसमें अन्य NULशामिल हैं। इसके बजाय, कॉल करें _get_osfhandleऔर सीधे हैंडल की जांच करें ।
एरिक सन

29

प्रकार

chcp

अपना वर्तमान कोड पृष्ठ देखने के लिए (जैसा कि डेफ़ी पहले ही कह चुके हैं)।

उपयोग

nlsinfo

सभी स्थापित कोड पृष्ठ देखने के लिए और पता करें कि आपके कोड पृष्ठ का क्या अर्थ है।

उपयोग करने के लिए आपको विंडोज सर्वर 2003 रिसोर्स किट स्थापित करना होगा (विंडोज एक्सपी पर काम करता है) nlsinfo


19
दिलचस्प है, nlsinfoमेरे विंडोज 7 पर मौजूद नहीं है
जॉय

2
nlsinfoमेरे Windows XP SP3 मशीन पर भी मौजूद नहीं है।
थॉमस ओवेन्स

2
ओह मुझे खेद है। मुझे लगता है कि यह विंडोज सर्वर रिसोर्स किट टूल्स के साथ आता है। मैंने इसे अपने विंडोज एक्सपी एसपी 3 मशीन पर पहले भी कई बार इस्तेमाल किया है और यह नहीं पता था कि यह डिफ़ॉल्ट रूप से इंस्टॉल नहीं किया गया था।
कागदस अल्टिंक्या

आह, यह बताता है कि यह मेरी विस्टा मशीन पर क्यों है, जहां मैंने उन्हें स्थापित किया है।
जॉय

4
nlsinfoविंडोज 10E मशीन पर भी मौजूद नहीं है।
योषा अलायूबे

21

अपनी दूसरी क्वेरी फिर से उत्तर देने के लिए। एन्कोडिंग कैसे काम करती है, जोएल स्पोलस्की ने इस पर एक शानदार परिचयात्मक लेख लिखा । जोरदार सिफारिश।


13
मैंने इसे पढ़ा है और मैं इसे जानता हूं। हालांकि, विंडोज पर मैं हमेशा खो गया महसूस करता हूं क्योंकि ओएस और अधिकांश एप्लिकेशन एन्कोडिंग से पूरी तरह से अनभिज्ञ लगते हैं।
डांग्लंड

5

कमांड सीएचसी वर्तमान कोडपेज दिखाता है। इसके तीन अंक हैं: 8xx और विंडोज 12xx से अलग है। इसलिए एक अंग्रेजी-केवल पाठ टाइप करने से आपको कोई अंतर नहीं दिखाई देगा, लेकिन एक विस्तारित कोडपेज (सिरिलिक की तरह) गलत तरीके से मुद्रित होगा।


5
CHCP न तो केवल 3 अंक दिखाता है और न ही यह 8 ## प्रारूप में है। 437 उदाहरण के लिए एक अमेरिकी एन्कोडिंग है, और यह अंग्रेजी सिस्टम पर डिफैक्टो मानक है। - 65001 एक यूनिकोड एन्कोडिंग है (यदि मुझे यह सही याद है तो यह UTF-8 और 65000 UTF-7 है) और इसे चुना जा सकता है। उदाहरण के लिए, CMD 1250 कोड पृष्ठ पर जाने की अनुमति देता है, लेकिन मुझे नहीं पता कि ये कोड पृष्ठ कब से चयन योग्य हैं। (यह Win7 के तहत है।)
एडम एलएस

4

मैं विंडोज कोड पेज के मुद्दों और सी प्रोग्राम पोर्टेबिलिटी और स्थानीयकरण के मुद्दों के कारण लंबे समय से निराश हूं। पिछले पोस्टों ने लंबाई में मुद्दों को विस्तृत किया है, इसलिए मैं इस संबंध में कुछ भी नहीं जोड़ने जा रहा हूं।

एक लंबी कहानी को छोटा करने के लिए, आखिरकार मैंने विज़ुअल सी ++ मानक सी लाइब्रेरी के ऊपर अपनी खुद की यूटीएफ -8 संगतता लाइब्रेरी परत लिखना शुरू कर दिया। मूल रूप से यह पुस्तकालय सुनिश्चित करता है कि एक मानक सी प्रोग्राम सही ढंग से काम करता है, किसी भी कोड पेज में, यूटीएफ -8 का आंतरिक रूप से उपयोग करता है।

MsvcLibX नामक यह लाइब्रेरी, https://github.com/JFLarvoire/SysTibodibib पर खुले स्रोत के रूप में उपलब्ध है । मुख्य विशेषताएं:

  • C स्रोत UTF-8 में इनकोडिंग करते हैं, सामान्य चार [] C स्ट्रिंग्स और मानक C लाइब्रेरी API का उपयोग करते हैं।
  • किसी भी कोड पेज में, सब कुछ आंतरिक रूप से आपके कोड में UTF-8 के रूप में संसाधित होता है, जिसमें मुख्य () रूटीन argv [] शामिल है, जिसके साथ मानक इनपुट और आउटपुट स्वचालित रूप से सही कोड पेज में परिवर्तित हो जाते हैं।
  • सभी stdio.h फ़ाइल फ़ंक्शंस UTF-8 पाथनाम> 260 वर्णों का समर्थन करते हैं, जो वास्तव में 64 केबीटी तक का है।
  • समान स्रोत विजुअल C ++ और MsvcLibX और Visual C ++ C लाइब्रेरी का उपयोग करके और सफलतापूर्वक gif और Linux मानक C लाइब्रेरी का उपयोग करके लिनक्स में संकलित और लिंक कर सकते हैं, जिसमें #ifdef ... #endif ब्लॉक की कोई आवश्यकता नहीं है।
  • जोड़ता है लिनक्स में आम फाइलें शामिल हैं, लेकिन विजुअल C ++ में गायब है। Ex: unistd.h
  • लापता कार्यों को जोड़ता है, जैसे निर्देशिका I / O के लिए, प्रतीकात्मक लिंक प्रबंधन, आदि, पाठ्यक्रम के सभी UTF-8 समर्थन के साथ :-)।

GitHub पर MsvcLibX README में अधिक विवरण , जिसमें पुस्तकालय का निर्माण करना और इसे अपने स्वयं के कार्यक्रमों में उपयोग करना शामिल है।

रिहाई खंड GitHub ऊपर भंडार में इस MsvcLibX पुस्तकालय, कि अपनी क्षमताओं दिखाएगा उपयोग करने वाले कई कार्यक्रमों प्रदान करता है। Ex: PATH में गैर- ASCII नामों के साथ निर्देशिकाओं के साथ मेरे who.exe उपकरण का प्रयास करें, गैर- ASCII नामों के साथ कार्यक्रमों की खोज कर रहा है, और कोड पृष्ठों को बदल रहा है।

एक अन्य उपयोगी उपकरण है। यह प्रोग्राम किसी भी कोड पेज से डेटा स्ट्रीम को आसानी से किसी अन्य में बदल सकता है। इसका डिफ़ॉल्ट विंडोज कोड पेज में इनपुट है, और वर्तमान कंसोल कोड पेज में आउटपुट है। यह विंडोज GUI ऐप्स (उदा: नोटपैड) द्वारा उत्पन्न डेटा को सही ढंग से कमांड कंसोल में देखने की अनुमति देता है, जैसे कि एक साधारण कमांड के साथ:type WINFILE.txt | conv

यह MsvcLibX पुस्तकालय पूरी तरह से नहीं है, और इसे बेहतर बनाने के लिए योगदान का स्वागत है!


2

जावा में मैंने फ़ाइल लिखने के लिए "IBM850" एन्कोडिंग का उपयोग किया। इससे समस्या हल हो गई।

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