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

تقرأ pandas رموزًا غريبة بدل العربية، أو تتوقف بـ UnicodeDecodeError، أو يعرض Excel ملف CSV المصدَّر بشكل خاطئ؟ في Python يحدد المعامل encoding الفرق بين الصحيح والتالف. إليك الحالات المعتادة – ويمكنك إصلاح الملفات التالفة في متصفحك أعلاه.

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

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

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

إصلاح

  1. اسحب ملفًا أو الصق نصًا
  2. يتم الإصلاح تلقائيًا
  3. انسخ النتيجة أو نزّلها
أو اسحب الملف إلى هنا
  • دون رفع. تُصلح الملفات داخل متصفحك مباشرة ولا تغادر جهازك أبدًا.

  • خوادم في الاتحاد الأوروبي. يعمل Mojibuster على خادم في فنلندا (الاتحاد الأوروبي)، لذلك تسري اللائحة العامة لحماية البيانات (GDPR). نص اللائحة (EUR-Lex، بالإنجليزية)

UnicodeDecodeError عند القراءة

تتوقع pd.read_csv ملف UTF-8. فإذا حُفظ الملف بترميز Windows-1256 (ANSI العربي) تتوقف pandas برسالة UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 – والبايت 0xC7 هو الحرف ا في Windows-1256. عندها اذكر الترميز:

  • pd.read_csv('data.csv', encoding='cp1256') للملفات الآتية من Excel وويندوز العربي.
  • encoding='latin-1' لا يفشل أبدًا لكنه يقرأ العربية كرموز غريبة – فلا تستخدمه لها.
  • إذا لم تعرف الترميز فاسحب الملف إلى Mojibuster: يكتشفه ويحفظ الملف بترميز UTF-8.

رموز غريبة بدل العربية في DataFrame

إذا عرض DataFrame رموزًا مثل ط§ظ„ط¹، فقد قُرئ ملف UTF-8 بترميز cp1256 أو latin-1 – أو كانت البيانات تالفة من قبل. في الحالة الأولى يكفي encoding='utf-8'. أما إذا كانت البيانات نفسها تالفة فيفيد value.encode('cp1256').decode('utf-8') للقيم المفردة. لكنه يفشل مع البيانات المختلطة بمجرد أن تكون خلية سليمة. الأسهل: أصلح الملف بـ Mojibuster ثم اقرأه.

ملف CSV من pandas فُتح في Excel بلا BOM

قبل

ط§ظ„ط§ط³ظ…,ط§ظ„ظ…ط¯ظٹظ†ط©,ط§ظ„ط¥ظٹط±ط§ط¯
ط£ط­ظ…ط¯ ط­ط³ظ†,ط§ظ„ط±ظٹط§ط¶,1250
ظپط§ط·ظ…ط© ط§ظ„ط²ظ‡ط±ط§ط،,ط§ظ„ظ‚ط§ظ‡ط±ط©,980

بعد

الاسم,المدينة,الإيراد
أحمد حسن,الرياض,1250
فاطمة الزهراء,القاهرة,980

to_csv: يعرض Excel الملف بشكل خاطئ

يكتب df.to_csv('export.csv') ملف UTF-8 بلا BOM. يفتح Excel مثل هذه الملفات بترميز ANSI فتتحول الحروف العربية إلى رموز غريبة. مع encoding='utf-8-sig' تكتب pandas علامة BOM فيتعرف Excel على UTF-8. المزيد في Excel وCSV: حروف عربية غريبة.

open() على ويندوز

يستخدم open('file.txt') بلا encoding ترميز النظام على ويندوز، وهو غالبًا cp1256 في النظام العربي. فيقرأ سكربت يعمل على لينكس ملف UTF-8 نفسه على ويندوز كرموز غريبة. لذا مرّر دائمًا encoding='utf-8' أو اضبط متغير البيئة PYTHONUTF8=1. وبحسب PEP 686 سيصبح UTF-8 افتراضيًا في إصدارات Python القادمة.

بيانات الويب مع requests

تستنتج requests قيمة response.text من ترويسة Content-Type. فإذا لم تذكر استجابة نصية مجموعة المحارف هناك فإنها تفترض ISO-8859-1، فتظهر صفحات UTF-8 العربية رموزًا غريبة. اضبط response.encoding = 'utf-8' أولًا، أو استخدم response.json() الذي يكتشف UTF-8 بنفسه.

وإذا كُتب النص بـ errors='replace' إلى ترميز لا يحوي الحروف المطلوبة فالملف يحوي ? – وعندها تضيع المعلومات، راجع ما هي الرموز الغريبة.

أسئلة شائعة

هل توجد مكتبة Python لهذا؟

نعم، ftfy تصلح الرموز الغريبة داخل كود Python. أما للملفات المفردة بلا برمجة فـ Mojibuster أسرع ويعرض لك كل تغيير قبل الحفظ.

ما قيم encoding التي أحتاجها غالبًا؟

utf-8 وutf-8-sig (UTF-8 مع BOM) وcp1256 (ويندوز العربي) وiso-8859-6 وutf-16. لا يهم حجم الحروف ولا الشرطات.

هل تبقى الفواصل والأرقام كما هي؟

نعم. يغيّر Mojibuster الحروف التالفة فقط. تبقى الفواصل وعلامات الاقتباس وفواصل الأسطر كما هي تمامًا.

أدلة أخرى