السلام عليكم ورحمة الله وبركاته
إن الحديث عن موضوع ال Unicode وال Encoding يعتبر من الأساسيات الضرورية Fundamental Concepts لأي مبرمج ومهندس برمجيات، واكمالاً لسلسه (أساسيات يجب أن يعرفها اي مبرمج) فقد طرحنا سؤالاً عن مشكلة عامه نراها كثيراً بشكل دوري الا وهي أن النص العربي لا يظهر بشكل مقروء عند فتحه في ال Notepad
وقد تم أخذ مثال من الموسوعة الشاملة (وهي تتكون من ملفات txt كثيرة)، وكانت هذه الجزئية من الملف هي ال test case لسؤالنا (حمله من هنا) :
كما هو واضح من الصورة أن النص غير مقروء عند فتحه على الجهاز وهناك مشكلة في الترميز وتحتاج لاصلاح
السؤال الذي سنجيب عليه لماذا ظهر الملف هكذا عند فتحه وكيف يمكن اصلاحه وارجاعه الى نص مقروء ؟
الحل الذي ارسله أكثر المبرمجين ينطوي تحت كلمة Unicode وأنه يجب أن يتم تحويل الملف الى UTF-8 حتى يتم اصلاح الملف وارجاعه الى الصيغه الأصلية..
لنرى هذه الحلول وكيف أنها قد لا تحل المشكلة:
تحويل ترميز الملف باستخدام الNotepad كما تلاحظ نفس المخرج بالضبط بعد تحويله ل UTF-8:
وبنفس الفكرة هنا بعد ترميز الملف ب UTF-8 باستخدام Notepad++ أو اي طريقة اخرى ستجد نفس المخرج
ملاحظة: في حال ظهر الملف بعد تحميله بشكل صحيح وبعد تغيير ال Encoding بأحد الطرق السابقة سوف يظهر بشكل صحيح وذلك لأنك تستخدم نظام لغته الافتراضيه هي العربية Default Locale is Arabic ولذلك فلن تلاحظ هذه المشكلة وستجد الملف باللغه العربية الصحيح، لكن يمكنك القرائه في الموضوع حتى تعرف سبب المشكلة خصوصاً انها كانت بسبب شخص لديه نفس اعداداتك.
اذاً ما هو الحل اذا لم يظهر النص بشكل صحيح؟
في مثل هذه المسائل عليك بمعرفة نوع الترميز الذي استخدم في انشاء الملف، هناك طرق كثيرة مثلاً :
رمي الملف على المتصفح وسوف يحاول المتصفح معرفة الترميز بنفسه وسوف تجده من قائمه الاعدادت في المتصفح (اسم الترميز المستخدم لهذه الصفحة)
كما تلاحظ باستخدام المتصفح وجدنا ان الترميز هو Windows-1256 ، وهناك مواقع تستطيع الكشف عن ال Encoding للملف الذي ترسله لها ، ويمكنك كتابه برنامج هكذا ان احببت ايضاً.
طبعاً المتصفح عرف الترميز الصحيح لأنه يستخدم خوارزميات لمعرفة نوع الترميز المستخدم في الملف حتى يقوم بعرضه وسوف تجد أنه تمكن من ذلك بشكل صحيح.
بعد ذلك يجب ان تعلم أن برنامج ال Notepad ليس به خوارزميات متقدمة مثل البرامج الأخرى كالمتصفح ، فعندما يقوم بقرائه اي ملف فانه يحاول معرفة ال Encoding له وفي حال تعرف على ال Encoding يقوم بعرضه وسوف يظهر كما انشئه صاحب الملف، أما في حال أنه لم يتعرف على الملف فسوف يقوم بترميزه باستخدام ال Default Locale في النظام.
والNotepad فقط يستطيع التعرف على UTF-8 و UTF-16 (أغلب برامج الويندوز تطلق عليه Unicode) و ANSI (والذي هو عباره عن الترميز الافتراضي لديك في النظام).
نعود لمثالنا السابق، كان الملف ترميزه هو Windows-1256 والNotepad لا يستطيع فهم هذا الترميز فسوف يلجاً مباشره الى النظام ويجلب ال ANSI (أي ال Default Locale Encoding) ويقوم بعرضه..
للنظر اذاً للDefault Locale على جهازي:
كما هو واضح الان، ال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.
حل مشكلة اللغة العربية في النوت باد بخطوات بسيطة:
اذا لم تحول الملف الى UTF-8 بعد أن حولته ال Windows-1256 وقمت بحفظ الملف، فعندما تفتحه مره اخرى بال Notepad فلن يظهر بشكل صحيح لأن ال Notepad لا يعرف هذا الترميز وسوف يقرأ ال Locale من النظام واذا كان انجليزي فسوف تحصل على النص خاطئ ايضاً.
قد تتسائل الان لماذا صاحب الملف لم ينتبه لهذا الأمر ، السبب مرة اخرى هو ال أن برنامج النوت باد بدائي حقيقة وانه عندما تحفظ الملف ب ANSI فالترميز سوف يكون بناء على ال Locale الموجودة لديك في النظام :
- اذا كان ال Locale لديك عربي قم بفتح ملف Notepad واكتب اي نص عربي وقم بالتخزين بترميز ANSI (عن طريق الحفظ Save) سوف تجد أن عمل الملف بشكل عادي في جهازك بدون أي تحذير من البرنامج
- لكن اذا كان ال Locale انجليزي فسوف تأتيك رساله تحذير بأن الملف به أحرف ليست ANSI وانه يتوجب عليك الحفظ بال Unicode.
لذلك صاحب الملف والذي تسبب بالمشكلة كان لديه Locale عربي وقام بعمل الملف وحفظه على ANSI وشاهده بعد الحفظ وقام بنشره مطمئناً والحقيقة المرة أنه لن يعمل الا على ال Arabic Local Machines وسوف تراه بهذا الشكل عندما يكون جهازك English Locale.
الخلاصه:
- قبل تحويل الترميز في الملف يجب ارجاع الملف لأصله وبعدها قم بالترميز والا سيخرب الملف
- لا تخزن ملف نصي بصيغه Windows-1256 والا فلن يعمل على الأنظمة التي بها English Locale
- اجعل برنامجك يتعامل مع ال Unicode ولا تتعامل مع ال Default Locale في جهازك فقط فقد يختلف عن المستخدمين
- عندما تتعامل مع مشاكل ال Unicode لا تستعجل بطرح حل قبل ان تفهم المشكلة جيداً وتعرف مسبباتها
دمتم سالمين
جميل جداً. معلومات قيمة كما عهدناها منك يا وجدي 🙂
سؤال: ماذا لو كان النظام لا يدعم الـ Unicode؟ وهل توجد أنظمة لا تدعم الـ Unicode الآن؟
سؤال جميل ..
اذا كان النظام لا يدعم ال 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 احرف .. وهو ما يقلل من المساحة التخزينية.
شكراً لمداخلتك…
السلام عليكم أخي وجدي عصام
موضوع جد قيم شكرا لك أخي
الصراحة الموضوع جميل وفهم رائع وشرح رائع جزاك الله خير اخي
عندي سؤال لو تكرمت:
عند حفظ الـ notbad كيف أغير الـ Encoding من الـ ANSI الى الـ Unicode بحيث يظهر خيار الـ Unicode كأول خيار لي اوتوماتيكياً من دون ان اقوم بتغيره باليد؟؟؟
وشكراً جزيلاً
اعتقد أنني وجدت بعض الhacks لهذا الموضوع ولكني لم اجربها على اي حالة.. يمكنك البحث وستجد بعض الأدوات مثل:
http://www.softpedia.com/get/System/OS-Enhancements/Notepad-Default-UTF-8-Unicode-Creator.shtml
اذا وجدت وقت فيمكن أن نحلل البرنامج ونعرف كيف يعمل ونقوم بكتابه برنامج عربي للمستخدمين حتى ننهي مشكلة هذا الموضوع، لأن الnotepad مازال يستخدم بواسطة المستخدمين غير المبرمجين..
لك التحية..
السلام عليكم
كان لدي نوت باد وكل شيء في الويندوز تمام ةلكنها تحولت إلى اللغة الصينية؟ فكيف أردها للعربية؟
في حال تغير محتوى النص فلا يمكن بالطبع ارجاعه ، ربما اصابه فايروس ما، لكن يمكن ان ترفق مثال على ملف صالح ونفس الملف المعطوب ولنرى الامر
وشكراً.
شكرا جزيلا صديقي مقالة رائعة
شكراً جزيلاً أخي
برنامج كويك بوكس 2016 Quickbooks لدية مشكلة مثل هذة حيث يظهر الكلام باللغة العربية اثناء الكتابة فى مربع النص و بمجرد الخروج من مربع النص يتحول النص العربى لحروف انجليزية مبهمة و اذا ضغطت بالماوس على المربع يظهر النص العربى سليم مرة اخرى فهل هى مشكلة Unicode ام ماذا ؟
السلام عليكم كيفك اخي العزيز انا محتاجك جدا في استفسار ممكن نتواصل وات ساب او فايبر او فيس بوك لشرح لك المشكله بالضبط واكون شاكرا الك اخي العزيز
موضوع ومحتوى عربي ممتاز. استمر بارك الله فيك.
شكراً جزيلاً لكم أخى الكريم
شكراً جزيلاً لكم أخى الكريم
ماشاء الله
شرحك جميل و مبسط
جزاك الله خيرا
بارك الله فيك على الشرح المفصل والوافي
اخي العزيز
انا طالب ماجستير موضوعي (( مميز ذكي للحروف العربية )) وعند مرحلة التمييز ازعجتني كثير عندما يميز النص ويحفظ في النوت باد يظهر بحروف عربية خاطئة وكلمات مقطعة و مبهمة غير مفهومة هل له علاقة بعملية الترميز
اعمل على قارئ qr code pdf417 على الموبايل و يظهر لي النص بشكل حروف غير مفهومة ما الطريقة الاسهل لتحويلها لشكل مقروء علما بأنني سأقوم بنسخ بيانات عدة بطاقات الى ملف واحد ثم تحويلها لملف اكسل لاحقا
اخ وجدي اشكرك لهذه المعلومه حقيقة استفد منها وطالما كنت اعاني من هذه المشكلة