असली समस्या: हर कमांड की अपनी एन्कोडिंग
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।
पहले
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 काफ़ी है।