يوميات مبعسس

حل نهائي لمشكلة اختفاء اللغة العربية في شاشة القفل بدون كمبيوتر أو أدوات

تخيل أن تستيقظ صباحًا…

تحاول فتح هاتفك كما تفعل كل يوم، تُدخل رمز القفل مرارًا وتكرارًا… ولا يفتح!
تحاول وتحاول وتحاول، ثم تتوقف، “مطَنّن”، وتقول:
أكيد بسبب تخديرة القات… نسيت شكل الحروف!

لكن الحقيقة أبشع بكثير:
هاتفك لا يعرف العربية اليوم!
لقد فقد ذاكرته… نسي الحروف… خان الأبجدية!

مرعب، أليس كذلك؟
أن تجهلك آلةٌ كنت تحسبها صديقًا؟
أن تتنكّر لك لوحة المفاتيح التي كنت تغني لها كل صباح بأغاني “أيوب طارش”، وتدندن لها:
“بالله عليك وا مسافر…”
ثم فجأة، تنظر إليك وتقول:
“Sorry, I don’t speak Arabic.”

كأنك استيقظت فاقدًا اسمك في دولةٍ أوروبية، تصرخ: “أنا عربي!!”


لا تقلق، لن أتركك في هذه المأساة.
سأضع الحل أولًا، وسأنهي معاناتك مع هذا القفل الملعون، ثم نصحبك في جولة معرفية عميقة لفهم ما يحدث خلف الكواليس:

  • ما هو Unicode؟

  • ما هو ASCII؟

  • ما علاقة هذا كله بلوحة مفاتيحك؟

  • ولماذا ينهار كل شيء عندما تُعاد تشغيل الجهاز؟

  • ما هي مشكلة قفل الشاشة وانعدام لوحة المفاتيح العربية تحديدًا؟

  • وكيف تُمثَّل الحروف العربية باستخدام لوحة مفاتيح إنجليزية؟

  • بل وسأعطيك سكربت بايثون صغير، للتسلية والفضول، يحوّل لك الحروف العربية إلى رموز يفهمها النظام بعد أن “فقد هويته”!


ثم ستقول أنت، بكل عزم:
“والله لأُدخلنّها عربيةً ولو كره النظام.”

تصبح من نومك أيها العربي في ساعةٍ مباركةٍ من الصباح، تتناول هاتفك كما اعتدت، تقصده لتفتح قفله بكلمةٍ قد خططتها مرارًا، وألفتها أناملُك كما يألف القلب محبوبه، فإذا به –ولأول مرّة– يصدّك!

تحدّق في الحروف، فإذا هي على صورتها التي عرفت، وتسترجع الكلمة، فإذا هي عينُ ما كتبت، لا ريبة فيها ولا خطأ، غير أنّ الجهاز يُنكرها إنكار الغريب لغريبٍ لم يلتقِ به، ويُعيدك إلى أول الطريق غريبًا كأنك لم تمرّ به قط!

تأكلك الحيرة لا تدري: أأنتَ الذي نسيت لغتك، أم هاتفك قد جُنَّ؟
وليس الخلل –يا صاحبي– في الرقم ولا في ترتيب الحروف، ولكنّ العلّة في لسانٍ تغيّر، وفي آلةٍ خانتك بعد أن غيّرت جلدها.

إنه مأزقٌ خفي، لا يظهر إلا لأهل العربية من مستخدمي الهواتف، إذا ما أُعيد تشغيل الجهاز، وذهبت لوحة المفاتيح العربية أدراج الرياح، لتحلّ محلّها أخرى أعجمية، لا تعرف “محمدًا”، ولا تُحسن نطق “السلام”.

وهنا تبدأ الحكاية… حكايةُ حروفٍ أُقصيت، وكلماتٍ قُلبت، وسرٍّ رقميٍّ لم تُفتح مغالقه إلا لمن عرف الحيلة المستترة، تقبع خلف ستار الأبجدية!

الحواسيب لا تفهم إلا الأرقام

إنّ الحواسيب لا تدرك الحروف أو الكلمات كما نفهمها نحن، بل تُخزِّن وتتعامل مع كل شيء على هيئة أرقام ثنائية (صفر وواحد)، النظام الثنائي، هذا الحرف الذي تراه أمامك لا تفهمه الحواسيب إلا بالأرقام، ومن رحمة الله بنا أن هدى الإنسان وعرَّفه كيف يمكّن الحاسوب من فهم النصوص، فابتدع نظامًا يُحوِّل الحروف إلى أرقام!

فأوجد نظامين رئيسين لهذا الغرض:

  • الأول ASCII: نظام قديم يقتصر على اللغة الإنجليزية، حروفها.
  • الثاني Unicode: نظام حديث شمل جميع لغات العالم.

معيار الترميز الأمريكي لتبادل المعلومات، ASCII

هذا النظام ابتدع في ستينيات القرن الماضي، يقرن كل حرف برقم، لكل حرف من الحروف الإنجليزية رقم، وأيضًا الأرقام والرموز مقترنة برقم يميزها عن غيرها، فالحرف A مقترن بالرقم 65، ثم الحاسوب يأخذ هذا الرقم ويحوله إلى النظام الثنائي، إلى 01000001، وهكذا سائر الحروف مقترنة برقم يميزها عن غيرها وهي موضوعة في جدول:

الغرض من هذه الأنظمة أن نمثل الحروف التي نريد ثم الحاسوب يفهمها. الخوض في التفاصيل الدقيقة ليس هذا مقامه، ونرجئ شرحه إلى مقالات قادمة إن شاء الله وأعان.

لهذا النظام عيبه، وهو اقتصاره على اللغة الإنجليزية، فلا لغة عربية ولا صينية ولا لغات العالم، وهذا حدا بالعلماء أن يبتدعوا نظامًا جديدًا يعالج قصر هذا النظام، وقد كان.

النظام الشامل Unicode

نظام عالج العلة في النظام الآنف، وهو نظام حديث خصص رقمًا فريدًا لكل حرف في كل لغة، وضم فيه النظام السابق ASCII إليه وزاد عليه فشمل:

  • الإنجليزية: A, B
  • العربية: أ، ب
  • الصينية: 你،好
  • الرموز التعبيرية: 🚀

هذا النظام يُعطي كل حرف رقمًا فريدًا اسمه الرمز الموضعي Codepoint، ويُكتب عادة بنظام العدّ السادس عشري Hexadecimal.

أمثلة ذلك:

  • A = U+0041
  • س = U+0633
  • 😊 = U+1F60A

وتُخزَّن هذه الرموز داخل الحاسوب باستخدام صِيَغ ترميز مثل UTF-8 وUTF-16، ليس هذا موضع بسطها.

هذا النظام تُنظَّم الحروف فيه ضمن مجموعات ترميزية Unicode Blocks، مجموعة الحروف العربية تبدأ من الرمز الموضعي U+0600 وتنتهي عند الرمز الموضعي U+06FF (نطاق بين U+0600 وU+06FF)، أما الحروف اللاتينية تبدأ من الرمز الموضعي U+0000 إلى الرمز الموضعي U+007F، وهذه المجموعة شملت نظام ASCII كله، فلا حاجة له وسنعتمد نظام Unicode فهو الشامل!

لا تنس كلامنا عن المجموعات هذه، لأنها المفتاح لفهم الحيلة!

كيف تتعامل لوحات المفاتيح مع نظام Unicode؟

ماذا يحدث عند الضغط على زر في لوحة المفاتيح؟

الذي يحدث:

  1. إذا ضغطت على زر معين، مثل: A أو س
  2. تُرسل لوحة المفاتيح شيئًا اسمه رمز مفتاح Keycode، وهو رقم يُمثّل الزر الذي ضغطت عليه (كل زر على لوحة المفاتيح له رمز مفتاح يميزه)
  3. يحول نظام التشغي هذا الرمز إلى حرف باستعمال تخطيط لوحة المفاتيح keyboard layout الحالي، أي إن كانت لوحة المفاتيح بالعربية فالتخطيط الحالي هو تخطيط لوحة المفاتيح اللغة العربية.

مثلًا اللغة الإنجليزية، ضغطت على زر في لوحة المفاتيح الذي فيه حرف A

←← يرسل رمزًا (Keycode) يراه النظام

←← هذا الرمز مقترن بالرمز الموضعي U+0041

←← الذي إذا فسره النظام كان هو الحرف A.

أما اللغة العربية، إذا ضغطت على نفس الزر ←← يرى النظام الرمز الموضعي U+0633 ←← يفسره إلى الحرف س.


المشكلة: قفل الشاشة وانعدام لوحة المفاتيح العربية

بعض العرب يكتبون كلمة سرهم باللغة العربية، وبعض هواتف الأندرويد بعد إعادة التشغيل، تُجبر المستخدم على استعمال لوحة مفاتيح إنجليزية حصرًا، أما العربية فتختفي عند إدخال كلمة المرور، ويا سواد يومه، ما يصنع المسكين!

لا تخف، النظام وإن لم يظهر لوحة المفاتيح العربية (تخطيط لوحة المفاتيح العربية) فما زال يستقبل رموز Unicode العربية!

كل ما تحتاجه هو وسيلة لإرسال الحرف العربي المطلوب، ولكن بلوحة المفاتيح الإنجليزية!

نعم أيها القارئ الكريم، كما قرأت بأم عينك، نستطيع على إرسال الحروف العربية بلوحة مفاتيح إنجليزية، والمقدمة الآنفة كانت تمهيدًا حتى تعرف كيف نفعل ذلك وتكون على بيِّنة من أمرك.

كيف تُمثِّل الحروف العربية بلوحة المفاتيح الإنجليزية؟

أولًا، قلنا: كل حرف عربي له رمز Unicode يميزه، مثلًا س = U+0633

ثانيًا، قلنا: الحروف تُنظَّم في مجموعات ترميزية Unicode Blocks، المجموعة العربية تبدأ من الرمز الموضعي U+0600.

إذن يا مبعسس؟ ما الذي تملح له؟

ألمح لحيلة، فإذا طرحنا القيمة 0x0600 من رمز الحرف العربي، سنحص على رقم صغير يُمثَّل بأحرف ASCII. مثلًا الحرف سين رمزه في نظام الترميز Unicode هو U+0633، سنطرحه من القيمة 0x0600 ونرى الناتج:

0x0633 – 0x0600 = 0x33

الناتج 0x33، وهذا الناتج يندرج ضمن مجموعة الترميز ASCII، ونتيجته (أي نتيجة 0x33) هو الرقم 3

عند كتابة الرقم 3 في لوحة المفاتيح الإنجليزية، النظام يضيف إليها 0x0600 من تلقاء نفسه، فيفهمه على أنه الحرف س

أي أننا إذا كتبنا الرقم 3 فالنظام سيفسره على أنه الحرف سين!

الله أكبر يا مبعسس!!

إذا أضاف النظام قيمة 0x0600 إلى قيمة 0x33 فالناتج (U+0633)، وهو نفسه قيمة الحرف س، وهكذا ندخل الحروف العربية في لوحة المفاتيح الإنجليزية، ما أجمل العلم!

مثال عملي: كلمة المرور “سلام”

الحرف العربي رمز Unicode نتيجة العملية الحسابية ما يُكتب في لوحة المفاتيح
س U+0633 0x33 3
ل U+0644 0x44 D
ا U+0627 0x27 ' (علامة الاقتباس المفردة)
م U+0645 0x45 E

لإدخال كلمة المرور “سلام”، اكتب التالي على لوحة المفاتيح الإنجليزية:

3D'E

وقد كتبت هذا الرماز بلغة بايثون يحول لك المدخل العربي إلى حروف إنجليزية:

def arabic_to_latin(arabic_password):
    """
    Converts an Arabic password to its Latin keyboard equivalent
    using the Android lock screen encoding rule:
    LatinCharCode = ArabicCharCode - 0x0600
    """
    latin_chars = []
    for char in arabic_password:
        arabic_code = ord(char)
        
        # Check if character is in Arabic Unicode block (0x0600-0x06FF)
        if 0x0600 <= arabic_code <= 0x06FF:
            # Apply the encoding rule
            latin_code = arabic_code - 0x0600
            latin_char = chr(latin_code)
            latin_chars.append(latin_char)
        else:
            # Keep non-Arabic characters as-is (numbers, symbols, etc.)
            latin_chars.append(char)
    
    return ''.join(latin_chars)

# Example usage
if __name__ == "__main__":
    test_password = input("Enter Arabic password: ")
    latin_result = arabic_to_latin(test_password)
    
    print("\nArabic Password:", test_password)
    print("Latin Equivalent:", latin_result)
    print("\nOn lock screen, type:", ' '.join(latin_result))

انظر:

ماذا يحدث عندما تكتب الرقم 3؟

لأن كلمة السر في هاتفك بالعربية فالنظام ينتظر أن تُدخل كلمة السر بنظام الترميز Unicode ويكون المُدخل ضمن مجموعة الترميزية العربية التي تبدأ من الرمز الموضعي U+0600 وتنتهي عند الرمز الموضعي U+06FF (نطاق محصور بين U+0600 وU+06FF)، فإذا كانت كلمة السر ليست من ضمن هذه المجموعة فالنظام يضيف القيمة 0x0600 من تلقاء نفسه إلى المدخل، لكن لِمَ؟

حتى يجعله ضمن المجموعة الترميزية للغة العربية.

وما دام النظام يفعل ذلك فإننا احتلنا عليه وطرحنا تلك القيمة وحولنا الحرف العربي إلى قيمة في ترميز ASCII، وسيراها النظام قيمة ليست ضمن المجموعة الترميزية للغة العربية فسيضيف إليها القيمة 0x0600 وهكذا تكون النتيجة الحرف العربي!

 

🔐 تحويل كلمة مرور عربية إلى لاتينية

وهذا تطبيق اندرويد يقوم بنفس العمل من تطوير الاخ صفوان عبدالغني

رابط التحميل

الحواسيب لا تفهم إلا الأرقام

إنّ الحواسيب لا تدرك الحروف أو الكلمات كما نفهمها نحن، بل تُخزِّن وتتعامل مع كل شيء على هيئة أرقام ثنائية (صفر وواحد)، النظام الثنائي، هذا الحرف الذي تراه أمامك لا تفهمه الحواسيب إلا بالأرقام، ومن رحمة الله بنا أن هدى الإنسان وعرَّفه كيف يمكّن الحاسوب من فهم النصوص، فابتدع نظامًا يُحوِّل الحروف إلى أرقام!

فأوجد نظامين رئيسين لهذا الغرض:

  • الأول ASCII: نظام قديم يقتصر على اللغة الإنجليزية، حروفها.
  • الثاني Unicode: نظام حديث شمل جميع لغات العالم.

معيار الترميز الأمريكي لتبادل المعلومات، ASCII

هذا النظام ابتدع في ستينيات القرن الماضي، يقرن كل حرف برقم، لكل حرف من الحروف الإنجليزية رقم، وأيضًا الأرقام والرموز مقترنة برقم يميزها عن غيرها، فالحرف A مقترن بالرقم 65، ثم الحاسوب يأخذ هذا الرقم ويحوله إلى النظام الثنائي، إلى 01000001، وهكذا سائر الحروف مقترنة برقم يميزها عن غيرها وهي موضوعة في جدول:

الغرض من هذه الأنظمة أن نمثل الحروف التي نريد ثم الحاسوب يفهمها. الخوض في التفاصيل الدقيقة ليس هذا مقامه، ونرجئ شرحه إلى مقالات قادمة إن شاء الله وأعان.

لهذا النظام عيبه، وهو اقتصاره على اللغة الإنجليزية، فلا لغة عربية ولا صينية ولا لغات العالم، وهذا حدا بالعلماء أن يبتدعوا نظامًا جديدًا يعالج قصر هذا النظام، وقد كان.

النظام الشامل Unicode

نظام عالج العلة في النظام الآنف، وهو نظام حديث خصص رقمًا فريدًا لكل حرف في كل لغة، وضم فيه النظام السابق ASCII إليه وزاد عليه فشمل:

  • الإنجليزية: A, B
  • العربية: أ، ب
  • الصينية: 你،好
  • الرموز التعبيرية: 🚀

هذا النظام يُعطي كل حرف رقمًا فريدًا اسمه الرمز الموضعي Codepoint، ويُكتب عادة بنظام العدّ السادس عشري Hexadecimal.

أمثلة ذلك:

  • A = U+0041
  • س = U+0633
  • 😊 = U+1F60A

وتُخزَّن هذه الرموز داخل الحاسوب باستخدام صِيَغ ترميز مثل UTF-8 وUTF-16، ليس هذا موضع بسطها.

هذا النظام تُنظَّم الحروف فيه ضمن مجموعات ترميزية Unicode Blocks، مجموعة الحروف العربية تبدأ من الرمز الموضعي U+0600 وتنتهي عند الرمز الموضعي U+06FF (نطاق بين U+0600 وU+06FF)، أما الحروف اللاتينية تبدأ من الرمز الموضعي U+0000 إلى الرمز الموضعي U+007F، وهذه المجموعة شملت نظام ASCII كله، فلا حاجة له وسنعتمد نظام Unicode فهو الشامل!

لا تنس كلامنا عن المجموعات هذه، لأنها المفتاح لفهم الحيلة!

كيف تتعامل لوحات المفاتيح مع نظام Unicode؟

ماذا يحدث عند الضغط على زر في لوحة المفاتيح؟

الذي يحدث:

  1. إذا ضغطت على زر معين، مثل: A أو س
  2. تُرسل لوحة المفاتيح شيئًا اسمه رمز مفتاح Keycode، وهو رقم يُمثّل الزر الذي ضغطت عليه (كل زر على لوحة المفاتيح له رمز مفتاح يميزه)
  3. يحول نظام التشغي هذا الرمز إلى حرف باستعمال تخطيط لوحة المفاتيح keyboard layout الحالي، أي إن كانت لوحة المفاتيح بالعربية فالتخطيط الحالي هو تخطيط لوحة المفاتيح اللغة العربية.

مثلًا اللغة الإنجليزية، ضغطت على زر في لوحة المفاتيح الذي فيه حرف A

←← يرسل رمزًا (Keycode) يراه النظام

←← هذا الرمز مقترن بالرمز الموضعي U+0041

←← الذي إذا فسره النظام كان هو الحرف A.

أما اللغة العربية، إذا ضغطت على نفس الزر ←← يرى النظام الرمز الموضعي U+0633 ←← يفسره إلى الحرف س.


المشكلة: قفل الشاشة وانعدام لوحة المفاتيح العربية

بعض العرب يكتبون كلمة سرهم باللغة العربية، وبعض هواتف الأندرويد بعد إعادة التشغيل، تُجبر المستخدم على استعمال لوحة مفاتيح إنجليزية حصرًا، أما العربية فتختفي عند إدخال كلمة المرور، ويا سواد يومه، ما يصنع المسكين!

لا تخف، النظام وإن لم يظهر لوحة المفاتيح العربية (تخطيط لوحة المفاتيح العربية) فما زال يستقبل رموز Unicode العربية!

كل ما تحتاجه هو وسيلة لإرسال الحرف العربي المطلوب، ولكن بلوحة المفاتيح الإنجليزية!

نعم أيها القارئ الكريم، كما قرأت بأم عينك، نستطيع على إرسال الحروف العربية بلوحة مفاتيح إنجليزية، والمقدمة الآنفة كانت تمهيدًا حتى تعرف كيف نفعل ذلك وتكون على بيِّنة من أمرك.

كيف تُمثِّل الحروف العربية بلوحة المفاتيح الإنجليزية؟

أولًا، قلنا: كل حرف عربي له رمز Unicode يميزه، مثلًا س = U+0633

ثانيًا، قلنا: الحروف تُنظَّم في مجموعات ترميزية Unicode Blocks، المجموعة العربية تبدأ من الرمز الموضعي U+0600.

إذن يا مبعسس؟ ما الذي تملح له؟

ألمح لحيلة، فإذا طرحنا القيمة 0x0600 من رمز الحرف العربي، سنحص على رقم صغير يُمثَّل بأحرف ASCII. مثلًا الحرف سين رمزه في نظام الترميز Unicode هو U+0633، سنطرحه من القيمة 0x0600 ونرى الناتج:

0x0633 – 0x0600 = 0x33

الناتج 0x33، وهذا الناتج يندرج ضمن مجموعة الترميز ASCII، ونتيجته (أي نتيجة 0x33) هو الرقم 3

عند كتابة الرقم 3 في لوحة المفاتيح الإنجليزية، النظام يضيف إليها 0x0600 من تلقاء نفسه، فيفهمه على أنه الحرف س

أي أننا إذا كتبنا الرقم 3 فالنظام سيفسره على أنه الحرف سين!

الله أكبر يا مبعسس!!

إذا أضاف النظام قيمة 0x0600 إلى قيمة 0x33 فالناتج (U+0633)، وهو نفسه قيمة الحرف س، وهكذا ندخل الحروف العربية في لوحة المفاتيح الإنجليزية، ما أجمل العلم!

مثال عملي: كلمة المرور “سلام”

الحرف العربي رمز Unicode نتيجة العملية الحسابية ما يُكتب في لوحة المفاتيح
س U+0633 0x33 3
ل U+0644 0x44 D
ا U+0627 0x27 ' (علامة الاقتباس المفردة)
م U+0645 0x45 E

لإدخال كلمة المرور “سلام”، اكتب التالي على لوحة المفاتيح الإنجليزية:

3D'E

وقد كتبت هذا الرماز بلغة بايثون يحول لك المدخل العربي إلى حروف إنجليزية:

def arabic_to_latin(arabic_password):
    """
    Converts an Arabic password to its Latin keyboard equivalent
    using the Android lock screen encoding rule:
    LatinCharCode = ArabicCharCode - 0x0600
    """
    latin_chars = []
    for char in arabic_password:
        arabic_code = ord(char)
        
        # Check if character is in Arabic Unicode block (0x0600-0x06FF)
        if 0x0600 <= arabic_code <= 0x06FF:
            # Apply the encoding rule
            latin_code = arabic_code - 0x0600
            latin_char = chr(latin_code)
            latin_chars.append(latin_char)
        else:
            # Keep non-Arabic characters as-is (numbers, symbols, etc.)
            latin_chars.append(char)
    
    return ''.join(latin_chars)

# Example usage
if __name__ == "__main__":
    test_password = input("Enter Arabic password: ")
    latin_result = arabic_to_latin(test_password)
    
    print("\nArabic Password:", test_password)
    print("Latin Equivalent:", latin_result)
    print("\nOn lock screen, type:", ' '.join(latin_result))

انظر:

ماذا يحدث عندما تكتب الرقم 3؟

لأن كلمة السر في هاتفك بالعربية فالنظام ينتظر أن تُدخل كلمة السر بنظام الترميز Unicode ويكون المُدخل ضمن مجموعة الترميزية العربية التي تبدأ من الرمز الموضعي U+0600 وتنتهي عند الرمز الموضعي U+06FF (نطاق محصور بين U+0600 وU+06FF)، فإذا كانت كلمة السر ليست من ضمن هذه المجموعة فالنظام يضيف القيمة 0x0600 من تلقاء نفسه إلى المدخل، لكن لِمَ؟

حتى يجعله ضمن المجموعة الترميزية للغة العربية.

وما دام النظام يفعل ذلك فإننا احتلنا عليه وطرحنا تلك القيمة وحولنا الحرف العربي إلى قيمة في ترميز ASCII، وسيراها النظام قيمة ليست ضمن المجموعة الترميزية للغة العربية فسيضيف إليها القيمة 0x0600 وهكذا تكون النتيجة الحرف العربي!


🙏 ختامًا لا تنسونا من دعائكم ❤️

لا تنسوا الدعاء لكل من ساهم في “عجن وخبز” هذه المقالة،
ولا تنسوا إخوانكم في فلسطين 🇵🇸، فهم بحاجة لدعواتكم ومواقفكم.


Mr.Narsus

يا مَنْ يُسَائِلُ مَنْ أَنَا؟، أَنَا كُنْتُ يَوْمًا هَاهُنَا، رَكْبُ مُبَعْسِسٍ يَضُمُّنِي، لِلعِلمِ أَبْذُلُ مُؤْمِنا، سَطَّرْتُ عِلمًا نَافِعًا، صُغْتُ المَعْلُومَات نَاشِرًا، غُرَرَ الفَوَائِدِ سُقْتُهَا، لِتَكُونَ ذُخْرًا بَعْدَنَا، فَإِذَا مَرَرْتَ بِبَعْضِهَا، مِنْ دَعْوَةٍ لَا تَنْسَنَا!
مقالات بواسطة Mr.Narsus
هل لديك إستفسار ؟

اكتب رسالتك

15 + 3 =