متوفر أيضًا بلغات أخرى: English · Español · Português · Français
إصلاح الحروف المشوَّهة في النص
يصلح النص الذي كُتب بترميز UTF-8 ثم قُرئ بجدولٍ خاطئ، ويريك ما تغيّر بالضبط.
ما هذا التشوّه في الحروف؟
الملف يحوي بايتات. وترميز المحارف هو الاتفاق الذي يحوّل تلك البايتات إلى حروف، والتشوّه يقع حين يستعمل الكاتب اتفاقًا ويستعمل القارئ اتفاقًا آخر. كُتب النص بترميز UTF-8، حيث الحرف é هو البايتان C3 A9، ثم قرأه شيءٌ ما بجدولٍ ذي بايت واحد يَعُدّ هذين البايتين حرفين منفصلين: Ã و©. لم يفسد شيء في الطريق؛ فالبايتات سليمة، وإنما تُقرأ بالدليل الخطأ.
ولهذا صار الخراب سهل التعرّف عليه. تتراكم à و وâ و€ أمام الحروف المشكولة، وتصير الفاصلة العليا ’ وتصير الشرطة –. ومتى عرفت الشكل قرأته: ’ هي دائمًا فاصلة عليا يمنى مرئية من خلال Windows-1252.
ويعني ذلك أيضًا أن الإصلاح مضبوط لا تخميني. فإن سلمت البايتات، فإن ردّ كل محرف إلى البايت الذي جاء منه ثم قراءة تلك البايتات على أنها UTF-8 يعيد النص الأصلي؛ لا شيئًا قريبًا منه، بل الأصل نفسه. وعلى امتداد 1,112,032 نقطة ترميز يمكن أن يسنِدها يونيكود، تنجح هذه الرحلة ذهابًا وإيابًا عبر Windows-1252 في كل مرة.
كيف تصلحه
- الصق النص المشوَّه. يكون أفضل حين تلصق حقلًا أو اسمًا أو سطرًا في كل مرة. فكل سطر يُصلَح على حدة، ومن ثم لا مشكلة في مستندٍ فيه عمود واحد مكسور وأحد عشر سليمًا.
- اقرأ النتيجة ثم اقرأ الأزواج تحتها. يظهر كل محرف في النتيجة بجانب المحارف التي حلَّ محلها بالضبط. فإن صارت é هي é وصارت ’ فاصلة عليا فالإصلاح صحيح، وإن كان في تلك القائمة شيء أردت الإبقاء عليه فليس بصحيح.
- انسخه من جديد. وإذا لم يُصلَح شيء، فاللوحة تذكر أي السببين ينطبق: النص نظيف أصلًا، أو ما من جدول يفسّر كل محارفه.
لماذا ترفض هذه الأداة أكثر من غيرها
لأدوات الإصلاح عيبٌ لا يتحدث عنه أحد: أن تعيد كتابة نصٍّ لم يُكسر قط. وهذا أسوأ من ألا تفعل شيئًا، لأن الناتج يبدو معقولًا ولا سبب عند القارئ ليتحقق.
والقياس سهل، ولدى هذا الموقع 19,655 سطرًا من نثرٍ سليم بالإسبانية والبرتغالية والفرنسية والعربية في صفحاته نفسها. فمع ftfy، وهي التنفيذ المرجعي الذي يبني عليه الجميع، تعيد الدالةُ الأوضحُ كتابة 2,514 منها — أي 12.8 بالمئة — لأنها تقوّم كذلك الفواصل العليا المنحنية، وهذا لا صلة له بالترميز. أما دالتها الحذرة فتعيد كتابة خمسة. أربعة من هذه الخمسة هي الفقرة نفسها التي تشرح ما ترميز المحارف، بأربع لغات، لأن تلك الفقرة تقتبس التشوّه الذي تصفه. والخامسة جملة بالبرتغالية عن الحرف Ã.
وهذه الأداة لا تعيد كتابة أيٍّ منها، لسببٍ بنيوي: إنها تصلح السطر كله دفعةً واحدة. فيجب أن يقابل كل محرفٍ بايتًا، وأن تكون سلسلة البايتات كلها UTF-8 صحيحًا، فيكفي حرفٌ واحد مشكول حقًّا في أي موضع من السطر لينقض الإصلاح. ففي الجملة الفرنسية تُسهم كلمتا là où بالبايتين E0 20، وهما ما لا يمكن أن تكونه أي متتالية UTF-8، فيبقى السطر كما هو.
والثمن حقيقي ويستحق أن يُعرف. فإن كان التشوّه قد أصابه ضررٌ آخر بعده — كأن يحوّل خادم بريد مسافةً غير فاصلة إلى مسافةٍ عادية — لم يعد حساب البايتات مستقيمًا، فترفض هذه الأداة حيث تخمّن أداةٌ متساهلة. الصق مقطعًا أقصر وغالبًا ما ينجح.
حدود معلنة
لا تُجرَّب إلا جداول البايت الواحد: سبعة وعشرون افتراضيًا، وماك رومان خلف مربع اختيار. وماك رومان مستبعَد لسببٍ مقيس لا لحدس: فهو يضع الفاصلة العليا المنحنية على بايتٍ يفتح متتالية UTF-8، فتبدو عبارة فرنسية عادية مثل l’échelle تشوّهًا صحيحًا، وهو الجدول الوحيد من الثمانية والعشرين الذي ينطلق على نثرٍ لم يُكسر قط.
وليس كل جدول قابلًا للنقض. تسعة عشر من الثمانية والعشرين تُسنِد البايتات الـ256 كلها، والتشوّه العابر بها يمكن ردّه دائمًا. أما التسعة الأخرى فتترك بايتات بلا إسناد — إذ تترك ISO-8859-6 خمسةً وأربعين — والبايت الذي وقع على واحدٍ منها قد استُبدل حين قُرئ النص أول مرة، فضاع قبل أن يصل إلى هنا. واللوحة تخبرك في أي الحالين أنت.
وقد يفسّر النصَّ الواحد أكثرُ من جدول وتختلف فيما بينها. فتُعرض القراءة الأرجح وتُذكر البقية بدل إخفائها، لأن النص وحده لا يقول أيّها الصواب. والتشوّه اللاتيني تفسّره عادةً عشرات الجداول تفسيرًا واحدًا، أما التشوّه السيريلي فيفسّره في الغالب جدولٌ واحد بعينه.
وثمة محرف يحتاج انتباهًا حتى حين ينجح كل ما عداه: علامة ترتيب البايتات في أول السطر، U+FEFF، يحذفها أي مفكّك ترميز UTF-8 ما لم يُطلب منه صراحةً الإبقاء عليها. وهنا يُطلب منه ذلك، وهو فرق سطرٍ واحد تغفل عنه أغلب التنفيذات.
وأخيرًا، ما من أداة تفرّق بين مثالٍ مقتبس وخرابٍ حقيقي. فالصفحة التي تتحدث عن التشوّه تحوي تشوّهًا عن قصد. ولهذا تُعرض التغييرات مقرونةً بأصولها بدل أن تُطبَّق في صمت.
لماذا هي مجانية؟
كل شيء يجري في متصفحك. وجداول تحويل المحرف إلى بايت لا تُرسل مع الصفحة، بل تُقرأ من مفكّك الترميز في متصفحك نفسه، بايتًا بايتًا؛ وهذا لا يكلّف شيئًا ويجعل الجواب هو ما يعتقده متصفحك فعلًا عن كل جدول.
ولا يُرفع شيء. ولا خادم يُدفع ثمنه، فلا حساب ولا حدّ ولا علامة مائية.