إصلاح ترميز الحروف العربية في PowerShell

يكتب سكربتك ؟؟؟ أو رموزًا غريبة بدل العربية، أو تعرض النافذة نصًا مشوّهًا؟ يستخدم Windows PowerShell 5.1 ترميزًا مختلفًا حسب الأمر. إليك الأسباب والمعاملات الصحيحة – ويمكنك إصلاح الملفات التالفة في متصفحك أعلاه.

يعمل مع النصوص وهذه الملفات:

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

مثل ملفات Excel المصدّرة ونسخ قواعد البيانات والترجمات وشيفرة المواقع.

إصلاح

  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 قُرئ بـ Get-Content في PowerShell 5.1

قبل

ط§ظ„ظ…ط³طھط®ط¯ظ…;ط§ظ„ظ‚ط³ظ…;ط§ظ„ظپط±ط¹
ط£ط­ظ…ط¯ ط­ط³ظ†;ط§ظ„ظ…ط¨ظٹط¹ط§طھ;ط¬ط¯ط©
ظپط§ط·ظ…ط© ط§ظ„ط²ظ‡ط±ط§ط،;ط§ظ„ظ…ط´طھط±ظٹط§طھ;ط§ظ„ظ‚ط§ظ‡ط±ط©

بعد

المستخدم;القسم;الفرع
أحمد حسن;المبيعات;جدة
فاطمة الزهراء;المشتريات;القاهرة

اقرأ الملفات واكتبها بشكل صحيح

  • 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.

أدلة أخرى