Home مقالات عامة حل مشكلة اللغة العربية في النوت باد (كيف يحلها المبرمج)
حل مشكلة اللغة العربية في النوت باد (كيف يحلها المبرمج)

حل مشكلة اللغة العربية في النوت باد (كيف يحلها المبرمج)

3.89K
7

السلام عليكم ورحمة الله وبركاته

إن الحديث عن موضوع ال Unicode وال Encoding يعتبر من الأساسيات الضرورية Fundamental Concepts لأي مبرمج ومهندس برمجيات، واكمالاً لسلسه (أساسيات يجب أن يعرفها اي مبرمج) فقد طرحنا سؤالاً عن مشكلة عامه نراها كثيراً بشكل دوري الا وهي أن النص العربي لا يظهر بشكل مقروء عند فتحه في ال Notepad

arabic_encoding

وقد تم أخذ مثال من الموسوعة الشاملة (وهي تتكون من ملفات txt كثيرة)، وكانت هذه الجزئية من الملف هي ال test case لسؤالنا (حمله من هنا) :

the_problem

كما هو واضح من الصورة أن النص غير مقروء عند فتحه على الجهاز وهناك مشكلة في الترميز وتحتاج لاصلاح

 

questions

 

 

السؤال الذي سنجيب عليه لماذا ظهر الملف هكذا عند فتحه وكيف يمكن اصلاحه وارجاعه الى نص مقروء ؟

الحل الذي ارسله أكثر المبرمجين ينطوي تحت كلمة Unicode وأنه يجب أن يتم تحويل الملف الى UTF-8 حتى يتم اصلاح الملف وارجاعه الى الصيغه الأصلية..

لنرى هذه الحلول وكيف أنها قد لا تحل المشكلة:

تحويل ترميز الملف باستخدام الNotepad كما تلاحظ نفس المخرج بالضبط بعد تحويله ل UTF-8:

converting

وبنفس الفكرة هنا بعد ترميز الملف ب UTF-8 باستخدام Notepad++ أو اي طريقة اخرى ستجد نفس المخرج

ملاحظة: في حال ظهر الملف بعد تحميله بشكل صحيح وبعد تغيير ال Encoding بأحد الطرق السابقة سوف يظهر بشكل صحيح وذلك لأنك تستخدم نظام لغته الافتراضيه هي العربية Default Locale is Arabic ولذلك فلن تلاحظ هذه المشكلة وستجد الملف باللغه العربية الصحيح، لكن يمكنك القرائه في الموضوع حتى تعرف سبب المشكلة خصوصاً انها كانت بسبب شخص لديه نفس اعداداتك.

اذاً ما هو الحل اذا لم يظهر النص بشكل صحيح؟

في مثل هذه المسائل عليك بمعرفة نوع الترميز الذي استخدم في انشاء الملف، هناك طرق كثيرة مثلاً :
رمي الملف على المتصفح وسوف يحاول المتصفح معرفة الترميز بنفسه وسوف تجده من قائمه الاعدادت في المتصفح (اسم الترميز المستخدم لهذه الصفحة)

browser

كما تلاحظ باستخدام المتصفح وجدنا ان الترميز هو Windows-1256 ، وهناك مواقع تستطيع الكشف عن ال Encoding للملف الذي ترسله لها ، ويمكنك كتابه برنامج هكذا ان احببت ايضاً.

طبعاً المتصفح عرف الترميز الصحيح لأنه يستخدم خوارزميات لمعرفة نوع الترميز المستخدم في الملف حتى يقوم بعرضه وسوف تجد أنه تمكن من ذلك بشكل صحيح.

بعد ذلك يجب ان تعلم أن برنامج ال Notepad  ليس به خوارزميات متقدمة مثل البرامج الأخرى كالمتصفح ، فعندما يقوم بقرائه اي ملف فانه يحاول معرفة ال Encoding له وفي حال تعرف على ال Encoding يقوم بعرضه وسوف يظهر كما انشئه صاحب الملف، أما في حال أنه لم يتعرف على الملف فسوف يقوم بترميزه باستخدام ال Default Locale في النظام.

والNotepad فقط يستطيع التعرف على UTF-8 و UTF-16 (أغلب برامج الويندوز تطلق عليه Unicode) و ANSI (والذي هو عباره عن الترميز الافتراضي لديك في النظام).

نعود لمثالنا السابق، كان الملف ترميزه هو Windows-1256 والNotepad لا يستطيع فهم هذا الترميز فسوف يلجاً مباشره الى النظام ويجلب ال ANSI (أي ال Default Locale Encoding) ويقوم بعرضه..

للنظر اذاً للDefault Locale على جهازي:

SystemLocale

كما هو واضح الان، الDefault  هو اللغه الانجليزية وهكذا يعني أن ال Notepad سوف يعرض اي ملف مكتوب باستخدام ال Windows-1256 (وأي Encoding أخر لم يستطيع التعرف عليه) باستخدام ال Windows-1252 ولذلك سوف يظهر بشكل خاطئ.

لكن في حال أن ال Default Locale لديك هو عربي سوف يظهر النص بلا مشاكل على الاطلاق (حيث يتم ترميزه باستخدام ال  Windows-1256  وهو الافتراضي لكل الملفات النصية غير القابلة لمعرفة ترميزها.. والملف سوف يعمل طبعاً لأنه كتب بنفس الترميز الذي عرض به)

اذاً الحل المتقرح هو بتحويل ال Locale  في جهازك الى العربي وسوف يعمل معك..

وطبعاً هذا هو الحل المنتشر في اغلب المنتديات وهو الحل المعروف للجميع والذي كانت أغلب الاجابات حوله، ولكن هل حقاً هو حل جيد ؟

  • ماذا اذا كنت تكتب برنامج وتريد ان يعمل على مستخدمين في مناطق متوزعه ؟
  • ماذا اذا كتبت ملف Read-me أو help وأردت نشره لأكثر من 10000 مستخدم ؟ هل ستطلب منهم جميعهم تحويل ال Locale ؟
  • ماذا اذا كان المستخدم لا يوجد لديه Locale عربي في جهازه ؟

كل هذه الأمور تجعل حل تغيير ال Locale هو غير فعال خصوصاً للمبرمجين أو الناشرين للكتب والملفات الرقمية…

اذا ما هو الحل الصحيح في مثل هذا الأمر ؟

يجب عليك أن تحول الملف الى ال Unicode حتى يعمل على جميع الاجهزه ، و كما شاهدنا انه عندما قمت بالتحويل مباشره من ال ANSI (الذي كان Windows-1252 ) الى UTF-8 حصلت على مشكلة في المخرج

وهنا كان مكمن السؤال، لأنه قبل أن تحول النص لترميز جديد يجب أن يكون ذلك الملف بالترميز الصحيح، ولذلك عليك بتحويل الملف الى الترميز الصحيح اولاً والذي هو Windows-1256 وبعد ذلك سوف تحصل على النص العربي ومن ثم تقوم بتحويله ال UTF-8 وسوف تحصل على النص العربي الذي يعمل على جميع الأجهزه بغض النظر عن ال Locale.

تستطيع ذلك من خلال طرق كثيرة مثلاً:

فتح الملف من خلال المتصفح ، ومن ثم نسخ النص من المتصفح ووضعه على النوت باد ثم حفظ باسم وحدد ال UTF-8

أو من خلال الNotepad++ هي أن تحول الترميز ال Windows-1256 واحفظ الملف ثم حوله بعد ذلك الى UTF-8 من خلال قائمة Encoding.

حل مشكلة اللغة العربية في النوت باد بخطوات بسيطة:

encoding

اذا لم تحول الملف الى UTF-8 بعد أن حولته ال Windows-1256 وقمت بحفظ الملف، فعندما تفتحه مره اخرى بال Notepad  فلن يظهر بشكل صحيح لأن ال Notepad لا يعرف هذا الترميز وسوف يقرأ ال Locale من النظام واذا كان انجليزي فسوف تحصل على النص خاطئ ايضاً.

قد تتسائل الان لماذا صاحب الملف لم ينتبه لهذا الأمر ، السبب مرة اخرى هو ال أن برنامج النوت باد بدائي حقيقة وانه عندما تحفظ الملف ب ANSI فالترميز سوف يكون بناء على ال Locale الموجودة لديك في النظام :

  • اذا كان ال Locale لديك عربي قم بفتح ملف Notepad واكتب اي نص عربي وقم بالتخزين بترميز ANSI (عن طريق الحفظ Save) سوف تجد أن عمل الملف بشكل عادي في جهازك بدون أي تحذير من البرنامج
  • لكن اذا كان ال Locale انجليزي فسوف تأتيك رساله تحذير بأن الملف به أحرف ليست ANSI وانه يتوجب عليك الحفظ بال Unicode.

لذلك صاحب الملف والذي تسبب بالمشكلة كان لديه Locale عربي وقام بعمل الملف وحفظه على ANSI وشاهده بعد الحفظ وقام بنشره مطمئناً والحقيقة المرة أنه لن يعمل الا على ال Arabic Local Machines وسوف تراه بهذا الشكل عندما يكون جهازك English Locale.

الخلاصه:

  1. قبل تحويل الترميز في الملف يجب ارجاع الملف لأصله وبعدها قم بالترميز والا سيخرب الملف
  2. لا تخزن ملف نصي بصيغه Windows-1256 والا فلن يعمل على الأنظمة التي بها  English Locale
  3. اجعل برنامجك يتعامل مع ال Unicode ولا تتعامل مع ال Default Locale في جهازك فقط فقد يختلف عن المستخدمين
  4. عندما تتعامل مع مشاكل ال Unicode لا تستعجل بطرح حل قبل ان تفهم المشكلة جيداً وتعرف مسبباتها

دمتم سالمين

(3888)

وجدي عصام مهندس برمجيات مهتم بعلوم الحاسب وبالأخص مجال الخوارزميات وهندسة البرمجيات وحماية التطبيقات،

Comment(7)

  1. جميل جداً. معلومات قيمة كما عهدناها منك يا وجدي 🙂

    سؤال: ماذا لو كان النظام لا يدعم الـ Unicode؟ وهل توجد أنظمة لا تدعم الـ Unicode الآن؟

  2. سؤال جميل ..

    اذا كان النظام لا يدعم ال Unicode فلن تستطيع عرضها للاسف لأنه يجب ان يفهم تلك البايتات المرسله اليه ويعرضها على حسب ما هو موجود في الUnicode.. لكن في مثل هذه الحالات عليك من الأول باستخدام الترميزات مثل Windows-1265 أو اي ترميز عربي اخر يرمز بواحد بايت فقط ، وسوف يتم عرضها كما في السابق عندما كان يتعامل مع العربي قبل وجود ال Unicode.

    لكن أغلب ما يقابل المبرمجيه هو أن الوسيط للنقل لا يدعم ال Unicode ، مثلاً في السابق تعاملنا مع Smart Cards من نوع ما وكنا نريد تخزين أحرف عربية بها ولكن للأسف الكرت كان لا يدعم ال Unicode ، لذلك في مثل هذه الحالات عليك بترميز النص الى طريقة تحوله ل Latin ومن ثم تسترجعه بصيغته الاصلية عندما تريد..

    وأسهل حل هو بأخذ الملف ك Bytes و تحويل البايتات الى Hex Digits وارسالها والطرف الاخر يأخذ تلك الHex (وبما أنه Latin) سوف يتم تخزينها بشكل طبيعي، وعند الاسترجاع تقوم بالعملية العكسية لتحصل على البايتات وتقوم بترميزها بUnicode.

    وطبعاً هذا يأخذ مساحة لكل 1 بايت يخزنها بحرفين هيكس اي 2 بايت (مثلاً لدينا 3 بايت سوف تخزن ك 6 بايت بالهيكس) والأفضل هو استخدام اي نوع من Encoding مثلاً Base64 والذي يخزن كل 3 بايت ب 4 بايت بالهيكس اي 4 احرف .. وهو ما يقلل من المساحة التخزينية.

    شكراً لمداخلتك…

  3. الصراحة الموضوع جميل وفهم رائع وشرح رائع جزاك الله خير اخي
    عندي سؤال لو تكرمت:
    عند حفظ الـ notbad كيف أغير الـ Encoding من الـ ANSI الى الـ Unicode بحيث يظهر خيار الـ Unicode كأول خيار لي اوتوماتيكياً من دون ان اقوم بتغيره باليد؟؟؟
    وشكراً جزيلاً

    1. اعتقد أنني وجدت بعض الhacks لهذا الموضوع ولكني لم اجربها على اي حالة.. يمكنك البحث وستجد بعض الأدوات مثل:
      http://www.softpedia.com/get/System/OS-Enhancements/Notepad-Default-UTF-8-Unicode-Creator.shtml

      اذا وجدت وقت فيمكن أن نحلل البرنامج ونعرف كيف يعمل ونقوم بكتابه برنامج عربي للمستخدمين حتى ننهي مشكلة هذا الموضوع، لأن الnotepad مازال يستخدم بواسطة المستخدمين غير المبرمجين..

      لك التحية..

  4. السلام عليكم
    كان لدي نوت باد وكل شيء في الويندوز تمام ةلكنها تحولت إلى اللغة الصينية؟ فكيف أردها للعربية؟

    1. في حال تغير محتوى النص فلا يمكن بالطبع ارجاعه ، ربما اصابه فايروس ما، لكن يمكن ان ترفق مثال على ملف صالح ونفس الملف المعطوب ولنرى الامر

      وشكراً.

LEAVE YOUR COMMENT

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مشاركة