PowerShell में हिंदी टेक्स्ट की एन्कोडिंग ठीक करें

आपकी स्क्रिप्ट हिंदी की जगह हिंदी या ? लिखती है, या कंसोल में टेक्स्ट बिगड़ा दिखता है? Windows PowerShell 5.1 में हर कमांड की एन्कोडिंग अलग होती है। यहाँ कारण और सही पैरामीटर हैं – और टूटी फ़ाइल आप ऊपर ब्राउज़र में ही ठीक कर सकते हैं।

टेक्स्ट और ये फ़ाइलें चलती हैं:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

जैसे Excel एक्सपोर्ट, डेटाबेस डंप, सबटाइटल या वेबसाइट का कोड।

ठीक करें

  1. फ़ाइल खींचकर लाएँ या टेक्स्ट पेस्ट करें
  2. अपने-आप ठीक हो जाता है
  3. कॉपी या डाउनलोड करें
या फ़ाइल यहाँ खींचकर लाएँ
  • कोई अपलोड नहीं। फ़ाइलें आपके ब्राउज़र में ही ठीक होती हैं और आपके डिवाइस से बाहर नहीं जातीं।

  • सर्वर EU में। Mojibuster फ़िनलैंड (EU) के एक सर्वर पर चलता है, इसलिए यूरोप का सामान्य डेटा संरक्षण विनियमन (GDPR) लागू होता है। GDPR पढ़ें (EUR-Lex, अंग्रेज़ी)

असली समस्या: हर कमांड की अपनी एन्कोडिंग

Windows PowerShell 5.1 में लगभग हर कमांड की अपनी डिफ़ॉल्ट एन्कोडिंग है: Get-Content बिना BOM वाली फ़ाइल को ANSI (Windows-1252) मानकर पढ़ता है, Out-File और > UTF-16 लिखते हैं, Set-Content ANSI और Export-Csv ASCII। इसीलिए UTF-8 हिंदी ह बन जाती है या ? हो जाती है। PowerShell 7 में सब एक हो गया है – हर जगह बिना BOM का UTF-8।

PowerShell 5.1 में Get-Content से पढ़ी गई UTF-8 फ़ाइल

पहले

Hkkjr dh jkt/kkuh ubZ fnYyh gS

बाद में

भारत की राजधानी नई दिल्ली है

फ़ाइल सही तरह पढ़ें और लिखें

  • Get-Content data.csv -Encoding UTF8 बिना BOM वाली UTF-8 फ़ाइल भी सही पढ़ता है।
  • Set-Content, Out-File और Add-Content में -Encoding UTF8 से UTF-8 लिखें – 5.1 में हमेशा BOM के साथ।
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation लिखें; ASCII डिफ़ॉल्ट हिंदी अक्षरों को ? से बदल देता है।
  • सभी कमांड के लिए एक साथ: स्क्रिप्ट की शुरुआत में $PSDefaultParameterValues['*:Encoding'] = 'utf8'।

Invoke-RestMethod और Invoke-WebRequest से वेब रिक्वेस्ट

अगर सर्वर Content-Type में character set नहीं बताता, तो Windows PowerShell 5.1 जवाब को ISO-8859-1 मानकर डिकोड करता है। तब हिंदी UTF-8 जवाब में हिंदी जैसा टेक्स्ट आता है। हल: जवाब को बाइट में लें और खुद डिकोड करें, जैसे [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray())।

हिंदी वाली स्क्रिप्ट फ़ाइल

स्क्रिप्ट को UTF-8 बिना BOM के सेव करें तो Windows PowerShell 5.1 उसे ANSI पढ़ता है। Write-Host "हिंदी" जैसी स्ट्रिंग तब हिंदी बन जाती है। .ps1 फ़ाइल UTF-8 BOM के साथ सेव करें – VS Code में स्टेटस बार की एन्कोडिंग से, Notepad++ में Encoding → UTF-8-BOM से।

कंसोल

अगर सिर्फ़ कंसोल विंडो में ? या अजीब चिह्न दिखते हैं, तो अक्सर फ़ाइल ठीक होती है – कंसोल का फ़ॉन्ट या एन्कोडिंग देवनागरी नहीं दिखा पाती। आउटपुट एन्कोडिंग [Console]::OutputEncoding = [Text.Encoding]::UTF8 से बदलें। बाहरी प्रोग्राम को भेजे जाने वाले आउटपुट के लिए $OutputEncoding = [Text.Encoding]::UTF8 भी सेट करें।

अगर फ़ाइल पहले ही टूटी लिखी जा चुकी है, तो उसे ऊपर के बॉक्स में डालें: Mojibuster ह जैसे अक्षर ठीक करता है और ANSI फ़ाइल को UTF-8 में बदलता है। फ़ाइल में पहले से ? हों तो टेक्स्ट खो चुका है – देखें मोजिबाके क्या है।

अक्सर पूछे जाने वाले सवाल

मेरे पास PowerShell का कौन-सा वर्शन है?

$PSVersionTable.PSVersion बताता है। 5.1 Windows में बना Windows PowerShell है; 7 से आगे सिर्फ़ PowerShell कहलाता है और डिफ़ॉल्ट रूप से UTF-8 इस्तेमाल करता है।

PowerShell से बनी CSV Excel में गलत क्यों खुलती है?

PowerShell 7 बिना BOM का UTF-8 लिखता है, जिसे Excel नहीं पहचानता। -Encoding utf8BOM इस्तेमाल करें या Mojibuster में फ़ाइल BOM के साथ सेव करें। विस्तार से: Excel और CSV में हिंदी फ़ॉन्ट की समस्या।

क्या chcp 65001 ज़रूरी है?

सिर्फ़ उन प्रोग्राम के लिए जो कंसोल कोड पेज के हिसाब से चलते हैं। PowerShell के अंदर [Console]::OutputEncoding काफ़ी है।

और गाइड