متوفر أيضًا بلغات أخرى: English · Español · Português · Français
ملف properties. في جافا: الترميز والحروف المهرَّبة
الصق ملف properties. وقارن ما يقرؤه كلٌّ من مُحمّلَي جافا من البايتات نفسها، مع الصورة المهرَّبة التي توفّق بينهما.
ما ملف properties.؟
ملف properties. أقدم صيغ الإعداد في جافا وأبسطها: مفتاح وقيمة في كل سطر يفصل بينهما علامة يساوي، وعلامة مربّع تفتح تعليقًا. وهو في المكتبة القياسية منذ البداية، ولا تزال أغلب حزم الترجمة تُكتب به، وهو من البساطة بحيث يحرّره الناس بأي برنامج تصادف أن يكون مفتوحًا أمامهم.
غير أن هذه البساطة تخفي شيئًا. فالملف لا ترميز له في ذاته: ليس في داخله ما يدلّ على ترميزه، ولا ترويسة ولا علامة ترتيب بايتات، والجواب متروك بالكامل للدالة التي فتحته. فإن قُرئ بدالة التدفّق صار كل بايت حرفًا، أي ISO 8859-1. وإن قُرئ بدالة القارئ فالترميز هو الذي بُني به ذلك القارئ. أما صيغة XML من الصيغة نفسها فترميزها المفترض UTF-8. صيغة واحدة وثلاثة أجوبة.
لذلك فالملف الذي يبدو سليمًا في محرّرك ليس بالضرورة الملف الذي يقرؤه برنامجك. تعرض هذه الصفحة القراءتين جنبًا إلى جنب من البايتات نفسها، وتؤشّر على القيم التي تختلفان فيها، وتعطيك الصورة المهرَّبة التي يقرؤها المُحمِّلان قراءةً واحدة.
طريقة الاستعمال
- الصق الملف. يُرمَّز بترميز UTF-8، وهو ما يحفظه أي محرّر حديث. وتغطّي أزرار الأمثلة نصًّا بحروف مشكولة، والنصَّ نفسه بعد التهريب، وقواعد الفواصل والتعليقات، ومسارًا من ويندوز، وسطرًا ممتدًّا.
- قارن العمودين. أحدهما ما يقرؤه مُحمِّل التدفّق والآخر ما يقرؤه قارئ UTF-8، وكلاهما من البايتات نفسها. والصف المؤشَّر عليه قيمةٌ سيراها برنامجك مختلفة تبعًا لطريقة فتح الملف.
- خذ الصورة المهرَّبة. كل ما تجاوز ASCII مكتوبًا في صورة تهريب. هذه النسخة لا يفسدها تغيير المحرّر لترميز الملف، وهي ما تكتبه جافا نفسها حين تحفظ ملف properties.
لماذا يُقرأ الملف الواحد قراءتين
يقول التوثيق ذلك صراحةً: دوالّ التدفّق تعمل كدوالّ القارئ إلا أن التدفّق مرمّز بترميز ISO 8859-1، وكل بايت فيه حرف من Latin-1. والتطبيق أصرح من ذلك: يتحوّل البايت إلى حرف بقناع بتاته الثمانية الدنيا، دون فاكّ ترميز البتّة.
فالملف المحفوظ بترميز UTF-8 إذا قُرئ بدالة التدفّق أعطى حرفًا لكل بايت. والحرف اللاتيني المشكول يشغل بايتين في UTF-8، فيصير البايتان حرفين، ولهذا تصل كلمة café في صورة café. القيمة لم تفسد في الطريق ولا شيء ينبّه إلى ذلك؛ إنما فُكّ ترميزها بقاعدة لم تكن في بال من حفظ الملف.
وههنا تمييز يحسن ضبطه، فمن اليسير أن يُفهم مقلوبًا. الحرف اللاتيني المشكول قابل تمامًا للتمثيل في ISO 8859-1، إذ هو بايت واحد فيها. فليست المشكلة أن الحرف يتعذّر كتابته، بل أن الملف كُتب بترميز غير الترميز الذي يُقرأ به. أما الحرف الذي يتجاوز U+00FF فبابٌ آخر: هذا لا يمكن كتابته في ISO 8859-1 أصلًا، ولا بدّ من تهريبه كي يراه مُحمِّل التدفّق مهما كان ترميز الملف.
والتهريب الذي يعالج الحالتين شرطة مائلة عكسية ثم حرف u ثم أربعة أرقام ست عشرية. أربعة بالضبط، وحرف u واحد لا غير: هكذا يقول التوثيق، والتطبيق المرجعي يرمي استثناءً بدل أن يخمّن إن وجد غير ذلك. وفي الأمر طرافة، فلغة جافا نفسها تقبل أي عدد من حروف u في التهريب داخل الشيفرة المصدرية. صياغة واحدة وقاعدتان مختلفتان في منصّة واحدة.
قواعد التهريب التي تأكل بياناتك
بعد الشرطة المائلة العكسية لا يعني شيئًا سوى أربعة حروف: t وr وn وf، لمسافة الجدولة وإرجاع العربة وسطر جديد وصفحة جديدة. وأي حرف آخر بعدها هو نفسه، وتختفي الشرطة. وهذا مقصود، إذ به تُدرج نقطتان أو علامة يساوي داخل المفتاح، لكنه يجعل مسارات ويندوز فخًّا.
اكتب مسارًا هكذا: C ثم نقطتان ثم شرطة عكسية ثم Users ثم شرطة عكسية ثم temp، فالنتيجة أسوأ من ضياع الفواصل. الشرطة الأولى تتبخّر قبل حرف U، والثانية يليها حرف t فتصير مسافة جدولة. وما يستلمه برنامجك هو C ثم نقطتان ثم Users ثم مسافة جدولة غير مرئية ثم emp. وتضعيف كل شرطة عكسية هو العلاج، وهو سبب المنظر الغريب لملفات properties. المليئة بمسارات ويندوز.
ولقواعد الأسطر مفاجآتها. ينتهي المفتاح عند أول علامة يساوي أو نقطتين أو مسافة أو جدولة أو صفحة جديدة، أيّها جاء أولًا، فسطرٌ فيه مفتاح ثم قيمة بلا أي علامة ترقيم مُدخلٌ صحيح تمامًا. وتُحذف المسافات من أول كل سطر، وتفتح علامة المربّع وعلامة التعجّب كلتاهما تعليقًا، والسطر المنتهي بشرطة عكسية يمتدّ إلى الذي يليه، وتُحذف مسافات أوله هو أيضًا. وهذه القاعدة الأخيرة هي ما يتيح تقسيم رسالة طويلة وإزاحتها دون أن تصير الإزاحة جزءًا من القيمة.
ما لا تفعله هذه الأداة
لا تقرّر ما يحويه ملفك فعلًا على القرص. أنت هنا تكتب نصًّا، وترمّزه الصفحة بترميز UTF-8 لأنه ما تحفظه المحرّرات اليوم. فإن كان ملفك محفوظًا حقًّا بترميز ISO 8859-1 فمُحمِّل التدفّق يقرؤه على وجهه، والقارئ هو الذي ينبغي إخباره: المقارنة نفسها في الاتجاه المعاكس.
وتقف عند حدّ الصيغة. أما أن تكون قيمةٌ ما عنوان قاعدة بيانات معقولًا، أو أن ينتمي مفتاحٌ إلى هذه الحزمة، أو أن تعثر آليّة حزم الموارد على الملف أصلًا، فشيء من ذلك لا يظهر في البايتات ولا يُفحص هنا. وإن كان ما بين يديك نصًّا وصل مشوَّهًا من قبل، فأداة إصلاح النص المشوَّه في هذا الموقع هي صفحته؛ وهذه الصفحة في إنتاج ملف لا يتشوّه من الأصل.
والسلوك الموصوف هنا سلوك جافا. ولغات أخرى تقرأ الصيغة نفسها بقواعدها هي، وعدد منها يفترض UTF-8 مباشرة، وهذا بعينه سبب أن يعمل ملف في سلسلة أدوات وينكسر في أخرى. والصورة المهرَّبة أرض مشتركة: هي ASCII خالص، فتتفق عليها القرّاء جميعًا على اختلاف مشاربهم.
لماذا هي مجانية؟
ترميز نصّ وإعادة قراءته بطريقتين حسابٌ يجريه متصفحك في الحال. ولا خادم في الطريق، فلا شيء يُحسب عليك ولا حساب تنشئه.
ولا يُرفع شيء. الملف الذي تلصقه يبقى في هذا التبويب.