أصل المشكلة: لكل أمر ترميز مختلف
في 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تكتب UTF-8 مع-Encoding UTF8– وفي 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 افتراضيًا.
لماذا يفتح Excel ملف CSV من PowerShell بشكل خاطئ؟
يكتب PowerShell 7 ملف UTF-8 بلا BOM ولا يتعرف عليه Excel. استخدم -Encoding utf8BOM أو احفظ الملف مع BOM في Mojibuster. المزيد في Excel وCSV: حروف عربية غريبة.
هل أحتاج إلى chcp 65001؟
فقط للبرامج التي تتبع صفحة رموز الكونسول. داخل PowerShell يكفي [Console]::OutputEncoding.