unicode विंडोज कमांड लाइन में यूनिकोड वर्णों का उपयोग कैसे करें?




command-line input (13)

हमारे पास टीम फाउंडेशन सर्वर (टीएफएस) में एक परियोजना है जिसमें इसमें एक गैर-अंग्रेजी चरित्र (š) है। कुछ बिल्ड-संबंधित चीजों को स्क्रिप्ट करने का प्रयास करते समय हमने एक समस्या पर ठोकर खाई है - हम कमांड लाइन टूल्स को š पत्र पास नहीं कर सकते हैं। कमांड प्रॉम्प्ट या यह और क्या गड़बड़ नहीं करता है, और tf.exe उपयोगिता निर्दिष्ट प्रोजेक्ट नहीं ढूंढ सकती है।

मैंने .bat फ़ाइल (एएनएसआई, यूटीएफ -8 के साथ और बिना BOM ) के लिए विभिन्न प्रारूपों की कोशिश की है और साथ ही इसे जावास्क्रिप्ट में स्क्रिप्ट कर रहा है (जो मूल रूप से यूनिकोड है) - लेकिन कोई भाग्य नहीं है। मैं एक प्रोग्राम कैसे निष्पादित कर सकता हूं और इसे यूनिकोड कमांड लाइन पास कर सकता हूं?


चूंकि मैंने पाइथन 2.7 के लिए कोई पूर्ण उत्तर नहीं देखा है, इसलिए मैं दो महत्वपूर्ण चरणों और एक वैकल्पिक चरण की रूपरेखा तैयार करूंगा जो काफी उपयोगी है।

  1. आपको यूनिकोड समर्थन के साथ एक फ़ॉन्ट चाहिए। विंडोज लुसीडा कंसोल के साथ आता है जिसे कमांड प्रॉम्प्ट के शीर्षक पट्टी पर राइट-क्लिक करके और Defaults विकल्प पर क्लिक करके चुना जा सकता है। यह रंगों तक पहुंच भी देता है। ध्यान दें कि आप इसके बजाय Properties को चुनकर कुछ तरीकों से आवंटित कमांड विंडो के लिए सेटिंग भी बदल सकते हैं (उदाहरण के लिए, यहां खुला, विजुअल स्टूडियो)।
  2. आपको कोड पेज को cp65001 पर सेट करने की आवश्यकता है, जो माइक्रोसॉफ्ट के कमांड प्रॉम्प्ट पर यूटीएफ -7 और यूटीएफ -8 समर्थन प्रदान करने का प्रयास प्रतीत होता है। कमांड प्रॉम्प्ट में chcp 65001 चलाकर ऐसा करें। एक बार सेट हो जाने पर, यह तब तक रहता है जब तक खिड़की बंद न हो जाए। Cmd.exe लॉन्च करने पर आपको हर बार इसे फिर से करने की आवश्यकता होगी।

अधिक स्थायी समाधान के लिए, सुपर उपयोगकर्ता पर इस उत्तर का संदर्भ लें। संक्षेप में, HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor पर regedit का उपयोग करके एक REG_SZ (स्ट्रिंग) प्रविष्टि बनाएं और इसे AutoRun नाम दें। इसका मूल्य chcp 65001 बदलें। यदि आप कमांड से आउटपुट संदेश नहीं देखना चाहते हैं, तो इसके बजाय @chcp 65001>nul उपयोग करें।

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


गैर-यूनिकोड प्रोग्राम के लिए भाषा की जांच करें। यदि आपको विंडोज कंसोल में रूसी के साथ समस्या है, तो आपको रूसी सेट करना चाहिए:


दरअसल, चाल यह है कि कमांड प्रॉम्प्ट वास्तव में इन गैर-अंग्रेज़ी पात्रों को समझता है, बस उन्हें सही तरीके से प्रदर्शित नहीं कर सकता है।

जब मैं कमांड प्रॉम्प्ट में पथ दर्ज करता हूं जिसमें कुछ गैर-अंग्रेज़ी chracters शामिल है तो इसे "?? ?????? ?????" के रूप में प्रदर्शित किया जाता है। जब आप अपना आदेश सबमिट करते हैं (सीडी "??? ?????? ?????" मेरे मामले में), सबकुछ अपेक्षित के रूप में काम कर रहा है।


यह समस्या काफी परेशान है। मेरे पास आमतौर पर मेरे फ़ाइल नाम और फ़ाइल सामग्री में चीनी वर्ण होता है। कृपया ध्यान दें कि मैं विंडोज 10 का उपयोग कर रहा हूं, मेरा समाधान यहां है:

फ़ाइल नाम प्रदर्शित करने के लिए, जैसे कि dir या ls अगर आपने विंडोज 10 पर उबंटू बैश स्थापित किया है

  1. गैर-utf 8 वर्ण का समर्थन करने के लिए क्षेत्र सेट करें।

  2. उसके बाद, कंसोल का फ़ॉन्ट उस लोकेल के फ़ॉन्ट में बदल दिया जाएगा, और यह कंसोल के एन्कोडिंग को भी बदल देगा।

कमांड लाइन उपकरण का उपयोग कर यूटीएफ -8 फ़ाइल की फ़ाइल सामग्री को प्रदर्शित करने के लिए, पिछले चरणों को करने के बाद

  1. पृष्ठ को chcp 65001 द्वारा utf-8 में chcp 65001
  2. यूटएफ -8 का समर्थन करने वाले फ़ॉन्ट में बदलें, जैसे लुसीडा कंसोल
  3. फ़ाइल सामग्री को देखने के लिए type कमांड का उपयोग करें, या cat अगर आपने विंडोज 10 पर उबंटू बैश स्थापित किया है
  4. कृपया ध्यान दें कि, कंसोल के एन्कोडिंग को utf-8 पर सेट करने के बाद, मैं चीनी इनपुट विधि का उपयोग कर cmd में चीनी वर्ण टाइप नहीं कर सकता।

सबसे अजीब समाधान: बस एक कंसोल एमुलेटर का उपयोग करें जैसे कि http://cmder.net/


प्रयत्न:

chcp 65001

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


विंडोज कंसोल के डिफ़ॉल्ट कोडपेज को बदलना काफी मुश्किल है। जब आप वेब पर खोज करते हैं तो आपको विभिन्न प्रस्ताव मिलते हैं, हालांकि उनमें से कुछ आपके विंडोज़ को पूरी तरह से तोड़ सकते हैं, यानी आपका पीसी अब बूट नहीं होता है।

सबसे सुरक्षित समाधान यह है: अपनी रजिस्ट्री कुंजी पर जाएं HKEY_CURRENT_USER\Software\Microsoft\Command Processor और स्ट्रिंग मान Autorun = chcp 65001

या आप सबसे सामान्य कोड पृष्ठों के लिए इस छोटे बैच-स्क्रिप्ट का उपयोग कर सकते हैं।

@ECHO off

SET ROOT_KEY="HKEY_CURRENT_USER"


FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i

ECHO System default values:

ECHO.
ECHO ...............................................
ECHO Select Codepage 
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.


SET /P  CP="Select a Codepage: "

if %CP%==1 (
    echo Set default Codepage to CP1252
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
    echo Set default Codepage to UTF-8
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
    echo Set default Codepage to CP850
    reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
    echo Set default Codepage to ISO-8859-1
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
    echo Set default Codepage to ISO-8859-15
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
    echo Set default Codepage to ASCII
    add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
    echo Reset Codepage to System Default
    reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
    echo Bye
) else (
    echo Invalid choice
    pause
)

@chcp 65001>nul बजाय @chcp 65001>nul का उपयोग आउटपुट को "सक्रिय कोड पृष्ठ: 65001" दबा देता है, जब भी आप एक नई कमांड लाइन विंडो शुरू करेंगे।

कोड पेज आइडेंटिफायर से प्राप्त सभी उपलब्ध नंबरों की एक पूरी सूची

नोट, सेटिंग्स केवल वर्तमान उपयोगकर्ता के लिए लागू होगी। यदि आप इसे सभी उपयोगकर्ताओं के लिए सेट करना चाहते हैं, तो SET ROOT_KEY="HKEY_LOCAL_MACHINE" द्वारा लाइन SET ROOT_KEY="HKEY_CURRENT_USER" को SET ROOT_KEY="HKEY_LOCAL_MACHINE"


एक वास्तव में सरल विकल्प विंडोज बैश खोल को स्थापित करना है जैसे कि MinGW और इसका उपयोग करें:

एक सीखने की वक्र का एक छोटा सा हिस्सा है क्योंकि आपको यूनिक्स कमांड लाइन कार्यक्षमता का उपयोग करने की आवश्यकता होगी, लेकिन आप इसकी शक्ति से प्यार करेंगे और आप कंसोल चरित्र सेट को यूटीएफ -8 पर सेट कर सकते हैं।

बेशक आप grep, find, less, आदि जैसे सभी सामान्य * निक्स उपहार भी प्राप्त करते हैं।


मुझे एक ही समस्या थी (मैं चेक गणराज्य से हूं)। मेरे पास विंडोज़ की एक अंग्रेजी स्थापना है, और मुझे साझा ड्राइव पर फ़ाइलों के साथ काम करना है। फ़ाइलों के पथ में चेक-विशिष्ट वर्ण शामिल हैं।

समाधान जो मेरे लिए काम करता है वह है:

बैच फ़ाइल में, वर्णमाला पृष्ठ बदलें

मेरी बैच फ़ाइल:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

बैच फ़ाइल को सीपी 1250 में सहेजा जाना है।

ध्यान दें कि कंसोल वर्णों को सही तरीके से नहीं दिखाएगा, लेकिन यह उन्हें समझ जाएगा ...


इसी तरह की समस्या के लिए, (मेरी समस्या एक कमांड प्रॉम्प्ट पर MySQL से UTF-8 वर्ण दिखाना था),

मैंने इसे इस तरह हल किया:

  1. मैंने कमांड प्रॉम्प्ट का फ़ॉन्ट लुसीडा कंसोल में बदल दिया। (यह कदम आपकी स्थिति के लिए अप्रासंगिक होना चाहिए। इसे केवल स्क्रीन पर जो कुछ भी दिखाई देता है उसके साथ ही करना है और वास्तव में चरित्र के साथ नहीं)।

  2. मैंने कोडपेज को विंडोज-1253 में बदल दिया। आप इसे "chcp 1253" द्वारा कमांड प्रॉम्प्ट पर करते हैं। यह मेरे मामले के लिए काम करता था जहां मैं यूटीएफ -8 देखना चाहता था।


मुझे यूनिकोड नामित फ़ाइलों को उनके छोटे (8 डॉट 3) नामों से बैच फ़ाइल में संदर्भित करके एक समान समस्या मिली।

छोटे नाम dir /x कर देखे जा सकते हैं। जाहिर है, यह केवल यूनिकोड फ़ाइल नामों के साथ काम करता है जो पहले से ही ज्ञात हैं।


मेरी पृष्ठभूमि: मैं वर्षों से कंसोल में यूनिकोड इनपुट / आउटपुट का उपयोग करता हूं (और इसे बहुत रोज़ाना करता हूं। इसके अलावा, मैं इस कार्य के लिए समर्थन उपकरण विकसित करता हूं)। जहां तक ​​आप निम्नलिखित तथ्यों / सीमाओं को समझते हैं, वहां बहुत कम समस्याएं हैं:

  • CMD और "कंसोल" असंबंधित कारक हैं। CMD.exe सिर्फ एक प्रोग्राम है जो कंसोल ("कंसोल एप्लिकेशन") के अंदर "अंदर काम करने" के लिए तैयार है।
  • AFAIK, CMD यूनिकोड के लिए सही समर्थन है; जब कोई कोडपृष्ठ सक्रिय होता है तो आप सभी यूनिकोड वर्णों को दर्ज / आउटपुट कर सकते हैं।
  • विंडोज़ कंसोल में यूनिकोड के लिए बहुत कम समर्थन है - लेकिन यह सही नहीं है (बस "पर्याप्त अच्छा"; नीचे देखें)।
  • chcp 65001 बहुत खतरनाक है। जब तक कि एक प्रोग्राम विशेष रूप से माइक्रोसॉफ्ट की सी रनटाइम लाइब्रेरी में दोषों के आसपास काम करने के लिए डिज़ाइन नहीं किया गया था (या एक अलग सीआरटीएल का उपयोग करता है), यह विश्वसनीय रूप से काम नहीं करेगा।
  • मैं cp1252 में काम करता हूं। जैसा कि मैंने पहले ही कहा है: कंसोल में यूनिकोड इनपुट / आउटपुट करने के लिए, किसी को कोडपृष्ठ सेट करने की आवश्यकता नहीं है

विवरण

  • यूनिकोड को कंसोल पर पढ़ने / लिखने के लिए, एक एप्लिकेशन (या इसकी सी रनटाइम लाइब्रेरी) फ़ाइल-आई / ओ एपीआई, लेकिन कंसोल-आई / ओ एपीआई का उपयोग करने के लिए पर्याप्त स्मार्ट होना चाहिए।
  • इसी तरह, यूनिकोड कमांड-लाइन तर्कों को पढ़ने के लिए, एक एप्लिकेशन (या इसकी सी रनटाइम लाइब्रेरी) संबंधित API का उपयोग करने के लिए पर्याप्त स्मार्ट होना चाहिए।
  • कंसोल फ़ॉन्ट प्रतिपादन केवल बीएमपी में यूनिकोड वर्णों का समर्थन करता है (दूसरे शब्दों में: नीचे U+10000 )। केवल साधारण टेक्स्ट प्रतिपादन समर्थित है (इसलिए यूरोपीय - और कुछ पूर्व एशियाई - भाषाओं को ठीक काम करना चाहिए - जहां तक ​​कोई प्रीकॉम्ज्ड फॉर्म का उपयोग करता है)। [पूर्वी एशियाई और पात्रों के लिए यू +0000, यू +0001, यू +30 एफबी के लिए यहां एक मामूली जुर्माना प्रिंट है।]

व्यावहारिक दृष्टिकोण

  • विंडो पर डिफ़ॉल्ट बहुत उपयोगी नहीं हैं। सर्वोत्तम अनुभव के लिए, किसी को कॉन्फ़िगरेशन के 3 टुकड़े ट्यून करना चाहिए:

  • एक कंसोल एप्लिकेशन (बहुत तकनीकी) में "चिपकाने" के साथ एक और गचाचा:

    • हेक्स इनपुट Alt KeyUp पर एक वर्ण प्रदान करता है; KeyDown पर एक चरित्र देने के अन्य सभी तरीके; KeyUp पर एक चरित्र देखने के लिए बहुत से अनुप्रयोग तैयार नहीं हैं। (केवल कंसोल-आई / ओ एपीआई का उपयोग कर अनुप्रयोगों पर लागू होता है।)
    • निष्कर्ष: कई अनुप्रयोग हेक्स इनपुट घटनाओं पर प्रतिक्रिया नहीं देंगे।
    • इसके अलावा, "चिपका हुआ" चरित्र के साथ क्या होता है वर्तमान कीबोर्ड लेआउट पर निर्भर करता है: यदि चरित्र को उपसर्ग कुंजी का उपयोग किए बिना टाइप किया जा सकता है (लेकिन संशोधक के मनमाने ढंग से जटिल संयोजन के साथ, जैसे Ctrl-Alt-AltGr-Kana-Shift-Gray* ) तो यह एक नकली कीप्रेस पर वितरित किया जाता है। यह वही है जो किसी भी आवेदन की अपेक्षा करता है - इसलिए ऐसे कुछ चिपकाने वाले जिनमें केवल ऐसे वर्ण होते हैं ठीक है।
    • हालांकि, "अन्य" वर्ण हेक्स इनपुट को अनुकरण करके वितरित किए जाते हैं।

    निष्कर्ष : जब तक आपका कीबोर्ड लेआउट उपसर्ग कुंजी के बिना वर्णों के बहुत सारे इनपुट का समर्थन करता है, तो कुछ बग्गी अनुप्रयोग कंसोल के यूआई के माध्यम से Paste करते समय वर्ण छोड़ सकते हैं: Alt-Space EP । ( यही कारण है कि मैं अपने कीबोर्ड लेआउट का उपयोग करने की सलाह देते हैं!)

आपको यह भी ध्यान में रखना चाहिए कि विंडोज़ के लिए "वैकल्पिक, 'अधिक सक्षम' कंसोल" बिल्कुल कंसोल नहीं हैं । वे कंसोल-आई / ओ एपीआई का समर्थन नहीं करते हैं, इसलिए प्रोग्राम जो इन एपीआई पर काम करने के लिए भरोसा करते हैं, काम नहीं करेंगे। (प्रोग्राम जो केवल "फाइल-आई / ओ एपीआई कंसोल फाइलहैंडल्स" का उपयोग करते हैं, ठीक काम करेंगे।)

ऐसे गैर-कंसोल का एक उदाहरण माइक्रोसोफ्ट के पावरहेल का हिस्सा है। मैं उसे इस्तेमाल नहीं करती; WinKey का प्रयोग, प्रेस और रिलीज WinKey , फिर WinKey टाइप करें।

सारांश

  • फ़ॉन्ट सेट करें, कीबोर्ड लेआउट (और वैकल्पिक रूप से, हेक्स इनपुट की अनुमति दें)।

  • कंसोल-आई / ओ एपीआई के माध्यम से जाने वाले केवल प्रोग्राम का उपयोग करें, और यूनिकोड कमांड-लाइन तर्क स्वीकार करें। उदाहरण के लिए, किसी भी cygwin compiled कार्यक्रम ठीक होना चाहिए। जैसा कि मैंने पहले ही कहा है, CMD भी ठीक है।


कोड पेज को 1252 में बदलना मेरे लिए काम कर रहा है। मेरे लिए समस्या प्रतीक डबल गुड़िया § विंडोज सर्वर 2008 पर डॉस द्वारा दूसरे प्रतीक में परिवर्तित हो रहा है।

मैंने अपने बीसीपी कथन ^ § में सीएचसीपी 1252 और इससे पहले एक टोपी का उपयोग किया है।


chcp 65001 -8 के लिए: chcp 65001

डिफ़ॉल्ट पर वापस: chcp 437





windows-console