ریشه مشکل: هر دستور، یک کدگذاری
در Windows PowerShell 5.1 تقریباً هر دستور کدگذاری پیشفرض خودش را دارد: Get-Content فایل بدون BOM را بهصورت ANSI میخواند (در ویندوز فارسی Windows-1256)، Out-File و > را UTF-16 مینویسند، Set-Content را ANSI مینویسد و Export-Csv را ASCII. PowerShell 7 این را یکی کرد و همهجا UTF-8 بدون BOM میگذارد.
قبل
ع©ط§ط±ط¨ط±;ط¨ط®ط´;ط´ط¹ط¨ظ‡ ط¹ظ„غŒ ع©ط±غŒظ…غŒ;ظپط±ظˆط´;طھظ‡ط±ط§ظ† ظ…ط±غŒظ… ط±ط¶ط§غŒغŒ;ط®ط±غŒط¯;ط§طµظپظ‡ط§ظ†
بعد
کاربر;بخش;شعبه علی کریمی;فروش;تهران مریم رضایی;خرید;اصفهان
فایلها را درست بخوانید و بنویسید
Get-Content data.csv -Encoding UTF8فایل UTF-8 را حتی بدون BOM درست میخواند.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 مجموعه نویسه را اعلام نکند، 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 نویسههایی مثل ط¹ظ„غŒ را درست میکند و فایلهای Windows-1256 را به UTF-8 تبدیل میکند، مثل تبدیل Windows-1256 به UTF-8. اگر فایل علامت سؤال دارد، متن از بین رفته – موجیباکه چیست را ببینید.
پرسشهای متداول
چه نسخهای از PowerShell دارم؟
$PSVersionTable.PSVersion نشان میدهد. 5.1 همان Windows PowerShell داخل ویندوز است؛ از 7 به بعد فقط PowerShell نام دارد و بهطور پیشفرض UTF-8 است.
چرا اکسل فایل CSV ساختهشده با PowerShell را غلط باز میکند؟
PowerShell 7 فایل UTF-8 بدون BOM مینویسد که اکسل نمیشناسد. از -Encoding utf8BOM استفاده کنید یا فایل را در Mojibuster با BOM ذخیره کنید. بیشتر در اکسل و CSV: فارسی بههمریخته.
آیا به chcp 65001 نیاز دارم؟
فقط برای برنامههایی که از صفحه کد کنسول پیروی میکنند. داخل PowerShell همان [Console]::OutputEncoding کافی است.