क्या UTF-8 कोड पृष्ठ पहचानकर्ता (65001) अन्य कंप्यूटरों पर भिन्न हो सकता है?


2

मैंने हाल ही में एक मित्र को समझाने की कोशिश की कि एक साधारण एक-पंक्ति बैच फ़ाइल कैसे बनाई जाए:

subst t: "X:\Example"

मेरी मशीन पर जो सालों से ठीक काम कर रही है, लेकिन उनके कहने पर मैं एक मुद्दे में भाग गया: उनके नाम में गैर-एएससीआईआई अक्षर (तुर्की अक्षर ı और ç सटीक होना) शामिल थे जिन्हें ठीक से पहचाना नहीं गया था।

इसका सरल उपाय यह है कि मैं जोड़ना चाहूंगा

chcp 65001

फ़ाइल के शीर्ष पर सक्रिय कोडपृष्ठ को UTF-8 एक में बदलने के लिए।

लेकिन यह काम नहीं किया। उनके कंप्यूटर पर यह कमांड शेल के क्रैश का कारण बना जो इसे निष्पादित कर रहा था। मैंने उन्हें कुछ अलग मूल्यों की कोशिश की; 65000 दुर्घटनाग्रस्त हो गए, लेकिन 10000 नहीं थे और नीचे के सभी मूल्य जो मैंने कोशिश की, साथ ही साथ काम किया, लेकिन मेरे कंप्यूटर पर समान मूल्यों के समान कोड पृष्ठों के अनुरूप नहीं थे। उनका डिफ़ॉल्ट कोड पेज अलग-अलग था (मेरे कंप्यूटर पर 850 के बजाय 857। यह समझ में आता है, एमएसडीएन के अनुसार, 857 एक तुर्की कोड पेज और 850 एक पश्चिमी यूरोपीय एक है)।

मुझे पता है कि कुछ कोड पेज कंप्यूटर से कंप्यूटर में बदल सकते हैं, लेकिन MSDN पेज स्पष्ट रूप से बताता है कि एक को UTF-8 का उपयोग करना चाहिए क्योंकि अन्य पेज बदल सकते हैं (बिल्कुल यह कि वे कब और कैसे बदलते हैं, इसके बारे में दस्तावेज़ीकरण की एक व्यथित कमी है)

क्या यह गलत है? क्या 65001 का मान भी बदल सकता है? यदि हां, तो इससे दुर्घटना क्यों होगी? क्या इसे "अमान्य कोड पृष्ठ" के बारे में शिकायत नहीं करनी चाहिए? और अगर यह बदलता है, तो कोई यह कैसे पता लगा सकता है कि इसे प्राप्त करने के लिए किस मूल्य का उपयोग करना है या मुझे गैर-एएसआईआईआई पात्रों को स्वीकार करने के लिए और कैसे मिल सकता है?

मैं अंग्रेजी भाषा के साथ विंडोज़ 10 का उपयोग कर रहा हूं (यह विंडोज़ 8.1 इतालवी के साथ पूर्वस्थापित किया गया था), जबकि मेरा दोस्त विंडोज़ 7 तुर्की का उपयोग करता है।


at the top of the file क्या आपने बैच फ़ाइल को UTF-8 एन्कोडिंग के साथ सहेजा है?
dxiv

@dxiv हाँ, मैंने किया (और सुनिश्चित किया कि मेरे दोस्त ने भी किया है)
Annonymus

जवाबों:


2

असल में, विंडोज cmd (और यह बैच स्क्रिप्ट दुभाषिया भी है) पर निर्भर करता है (वर्तमान) सक्रिय कोड पेज और बैच स्क्रिप्ट एन्कोडिंग के अनुरूप। उदाहरण के लिए, यदि आप किसी स्क्रिप्ट को सहेजते हैं Notepad तथाकथित में एएनएसआई एन्कोडिंग (जो दृढ़ता से निर्भर करता है विंडोज सिस्टम लोकेल ), फिर आपको इसे संबंधित कोड पृष्ठ के तहत चलाना चाहिए, देखें राष्ट्रीय भाषा समर्थन (एनएलएस) एपीआई संदर्भ :

  • English (US) : एएनएसआई एसीपी से मेल खाती है 1252 (सीपी 437 ),
  • English (UK) : एएनएसआई एसीपी से मेल खाती है 1252 (सीपी 850 ),
  • Turkish : एएनएसआई एसीपी से मेल खाती है 1254 (सीपी 857 ),
  • Central Europe: एएनएसआई एसीपी से मेल खाती है 1250 (सीपी 852 ), आदि।

आपका अनुमान सही है:

इसका सरल उपाय यह है कि मैं जोड़ना चाहूंगा chcp 65001 फ़ाइल के शीर्ष पर सक्रिय कोडपृष्ठ को UTF-8 में बदलने के लिए ... लेकिन यह काम नहीं किया।

दुर्भाग्य से, न तो विंडोज cmd न ही बैच दुभाषिया की परवाह है बाइट ऑर्डर मार्क और इसे एक मान्य चरित्र के रूप में मानता है - वर्तमान में सक्रिय कोड पृष्ठ की अवहेलना।
इसलिए, पहली पंक्ति ( CHCP 65001 आपके मामले में कमांड) UTF-8 एन्कोडेड फ़ाइल है गन्दा अगर BOM मौजूद है; ऐसे चलाने का प्रयास धूंधला कमांड से त्रुटि संदेश जाएगा ' CHCP' is not recognized as an internal or external command, operable program or batch file (errorlevel 9009 )।

समाधान: अपनी स्क्रिप्ट को बचाएं UTF-8 एन्कोडेड बिना बीओएम के
यदि आप ऐसा नहीं कर सकते तो समाधान Notepad हमेशा BOM लिखते हैं): अपनी स्क्रिप्ट की पहली पंक्ति के रूप में एक डमी कमांड का उपयोग करें, उदा। निम्नलिखित नुसार:

@rem if this line is visibly executed then BOM is present >NUL 2>&1
@echo OFF
    rem save current code page to the `_chcp` variable
for /F "tokens=2 delims=:" %%G in ('chcp') do set "_chcp=%%G"
    rem change active code page to UTF-8 (silently)
CHCP 65001 >NUL
    rem echo this is UTF-8 encoded batch file %~nx0
echo(
subst t: "D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ"
subst
dir /B /S t:\*.txt
subst t: /D
echo(
echo(  works as well for characters from Unicode Basic Multilingual Plane
subst t: "D:\bat\Unusual Names\CJK\中文(繁體)"
subst
dir /B /S t:\*.txt
subst t: /D
echo(
echo(  works even for characters from Unicode Supplementary Multilingual Plane
subst t: "D:\bat\Unusual Names\𝓜𝓪𝓽𝓱𝓑𝓸𝓵𝓭𝓢𝓬𝓻𝓲𝓹𝓽"
subst
dir /B /S t:\*.txt
subst t: /D
    rem set active code page back to previously saved value (verbose)
echo(
CHCP %_chcp%

उत्पादन :

==> utf8.bat

==> ´╗┐@rem if this line is visibly executed then BOM is present  1>NUL 2>&1

T:\: => D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ
t:\ĞÜİŞÇÖçğüşöı.txt

  works as well for characters from Unicode Basic Multilingual Plane
T:\: => D:\bat\Unusual Names\CJK\中文(繁體)
t:\chinese traditional.txt

  works even for characters from Unicode Supplementary Multilingual Plane
T:\: => D:\bat\Unusual Names\𝓜𝓪𝓽𝓱𝓑𝓸𝓵𝓭𝓢𝓬𝓻𝓲𝓹𝓽
t:\Mathematical Bold Script.txt

Active code page: 852

अंत में, आप अपनी स्क्रिप्ट से पहली पंक्ति (BOM युक्त) को निकाल सकते हैं more आदेश निम्नानुसार (ध्यान दें chcp 65001 दौड़ने से पहले more +1 … ):

==> chcp 65001
Active code page: 65001

==> more +1 utf8.bat > utf8noBOM.bat

==> utf8noBOM.bat

T:\: => D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ
t:\ĞÜİŞÇÖçğüşöı.txt

  works as well for characters from Unicode Basic Multilingual Plane
T:\: => D:\bat\Unusual Names\CJK\中文(繁體)
t:\chinese traditional.txt

  works even for characters from Unicode Supplementary Multilingual Plane
T:\: => D:\bat\Unusual Names\𝓜𝓪𝓽𝓱𝓑𝓸𝓵𝓭𝓢𝓬𝓻𝓲𝓹𝓽
t:\Mathematical Bold Script.txt

Active code page: 65001

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