رفع مشکل کدگذاری فارسی در PowerShell

اسکریپت شما به جای فارسی ؟؟؟ یا حروف عجیب می‌نویسد، یا کنسول متن به‌هم‌ریخته نشان می‌دهد؟ Windows PowerShell 5.1 بسته به دستور، کدگذاری متفاوتی به کار می‌برد. این‌جا علت‌ها و پارامترهای درست را می‌بینید – و فایل‌های خراب را همین بالا در مرورگر درست کنید.

با متن و این فایل‌ها کار می‌کند:

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

مثل خروجی اکسل، نسخه پشتیبان پایگاه داده، زیرنویس و کد وب‌سایت.

اصلاح

  1. فایل را بکشید یا متن را بچسبانید
  2. اصلاح خودکار انجام می‌شود
  3. نتیجه را کپی یا دانلود کنید
یا فایل را اینجا بکشید
  • بدون آپلود. فایل‌ها مستقیم داخل مرورگر شما اصلاح می‌شوند و هرگز از دستگاهتان خارج نمی‌شوند.

  • سرور در اتحادیه اروپا. Mojibuster روی سروری در فنلاند (اتحادیه اروپا) اجرا می‌شود؛ بنابراین مقررات عمومی حفاظت از داده‌ها (GDPR) برقرار است. متن مقررات (EUR-Lex، به انگلیسی)

ریشه مشکل: هر دستور، یک کدگذاری

در 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 می‌گذارد.

یک فایل UTF-8 که در PowerShell 5.1 با Get-Content خوانده شد

قبل

ع©ط§ط±ط¨ط±;ط¨ط®ط´;ط´ط¹ط¨ظ‡
ط¹ظ„غŒ ع©ط±غŒظ…غŒ;ظپط±ظˆط´;طھظ‡ط±ط§ظ†
ظ…ط±غŒظ… ط±ط¶ط§غŒغŒ;ط®ط±غŒط¯;ط§طµظپظ‡ط§ظ†

بعد

کاربر;بخش;شعبه
علی کریمی;فروش;تهران
مریم رضایی;خرید;اصفهان

فایل‌ها را درست بخوانید و بنویسید

  • 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 کافی است.

راهنماهای دیگر