PHP / أساسي: القيم وأسس الطلب / الدرس 2
النصوص وحدودها والترميز
عامل نصوص PHP كتسلسلات بايتات مع سياسة ترميز للنص البشري. شخّص الطول والبحث والوصل والتسلسل دون افتراض أن كل بايت حرف مرئي.
في هذه الصفحة
أهداف الدرس
- تمييز طول البايتات من وحدات Unicode.
- استخدام فحص صارم لنتيجة البحث.
- اختيار معالجة إخراج لكل سياق.
يخزن النص بايتات لا ضمان ترميز
يمكن أن يحوي نص PHP بايتات اعتباطية؛ ويقرر التطبيق هل هي UTF-8 أو بيانات ثنائية أو معرف. تعد strlen البايتات لا الحروف المرئية. وتختلف نقطة Unicode عن العنقود الكتابي؛ فقد تبدو نقاط عدة حرفاً واحداً بالتشكيل. وثّق وحدة حد الاسم ولا تستعر حجم العمود. استخدم العمليات والامتدادات المناسبة وتحقق من المشوه بدلاً من افتراض ترميز واحد للمصادر.
<?php
declare(strict_types=1);
$text = "أ";
preg_match_all("/./u", $text, $matches);
echo strlen($text), PHP_EOL;
echo count($matches[0]), PHP_EOL;
2
1
يشغل الحرف العربي المركب مسبقاً بايتين ونقطة واحدة، ولا يعد المثال العناقيد لكل نص.
بناء النص بحدود ظاهرة
يصل العامل النقطة النصوص، وتختلف علامات الاقتباس في الاستبدال والهروب؛ فاختر الأوضح. لا تجعل المدخل غير الموثوق صيغة تنسيق أو تعبير PHP منفذاً. أبقِ المبلغ عددياً حتى خطوة العرض. يختلف التنسيق عن الحساب ويحتاج التوطين لغة وقدرة امتداد محددين. حدّد نهايات السطور في الملفات واستخدم PHP_EOL لإخراج المنصة لا بروتوكول يتطلب بايتات معينة.
الموضع صفر مطابقة ناجحة
تعيد strpos موضعاً أو false. موضع البداية صفر كاذب منطقياً، فتخفي المقارنة المرنة بادئة موجودة. قارن بـfalse صراحة أو استخدم str_contains للسؤال عن الوجود. تعتمد الدلالة على البايت وحالة الحروف؛ وقد يحتاج البحث البشري تطبيعاً واستراتيجية محلية. حدّد معنى البحث الفارغ قبل تطبيق الدوال.
<?php
declare(strict_types=1);
$position = strpos("PHP basics", "PHP");
echo ($position === false ? "missing" : "found:" . $position), PHP_EOL;
echo (str_contains("PHP basics", "SQL") ? "yes" : "no"), PHP_EOL;
found:0
no
يكتشف الفحص الصارم البادئة عند الصفر، ويسأل الثاني عن الوجود فقط.
ترميز التمثيل ليس تهريباً عاماً
ينتج JSON تمثيله ويخدم تهريب HTML سياقات نص وصفات، ويخدم ترميز العنوان قواعد أخرى. لا تسمِّ تحويلاً واحداً آمناً للجميع. افصل بيانات المجال من العرض لتجنب تهريب مزدوج بين الصفحة وAPI. تجعل JSON_THROW_ON_ERROR الفشل صريحاً لا false فارغة. يجب أن تشمل سياسة UTF-8 التخزين والنقل والتحليل والإخراج حتى لا يفسد النص الصحيح عند الحد التالي.
فحص البايتات والمعنى دون إفساد البيانات
عند فساد الاسم حدد أول حد تتغير فيه البايتات. قارن قيمة مصطنعة عبر الفك والحفظ والقراءة والعرض بدلاً من التحويل المتكرر حتى يبدو صحيحاً. قد يتلف التحويل من مصدر مفترض المعلومات. احفظ الأصل للتحقيق ولا تسجل النص الشخصي بلا حاجة. الطول وحالة الحروف والتشذيب والتطبيع قرارات منتج أيضاً. اختبر العربية والتشكيل والفراغ والمشوه وفق العقد لا ASCII وحدها.
الأخطاء الشائعة وإصلاحها
رفض اسم عربي بحد بايتات إنجليزي
- لماذا يحدث؟
- الخلط بين البايت ووحدة الحرف المقصودة.
- كيف تصلحه؟
- الاتفاق على الوحدة والقياس المناسب لـUnicode.
- كيف تتجنب تكراره؟
- إدراج حالات متعددة اللغات والتشكيل.
الإبلاغ عن غياب بادئة موجودة
- لماذا يحدث؟
- فحص الصفر من strpos بمرونة.
- كيف تصلحه؟
- المقارنة الصارمة بـfalse أو واجهة وجود.
- كيف تتجنب تكراره؟
- اختبار البداية والوسط والغياب.
تهريب النص مرتين
- لماذا يحدث؟
- حفظ HTML المعروض كبيانات أصلية.
- كيف تصلحه؟
- حفظ الأصل المتحقق منه وعرضه حسب السياق.
- كيف تتجنب تكراره؟
- وضع التسلسل عند حدود مسماة.
اختبر فهمك
1. تبدأ قطعة نصية عند صفر. أي شرط يثبت وجودها؟
اعرض الحل المشروح
استخدم strpos($text, $needle) !== false؛ فالصفر نجاح لا يهمل. وإذا لم يهم الموضع عبّر بـstr_contains. حدّد أيضاً الفراغ وحالة الحروف عند المدخل.
2. هل تساوي نقطة Unicode دائماً حرفاً مرئياً واحداً؟
اعرض الحل المشروح
لا؛ قد تشكل نقاط عدة عنقوداً كتابياً واحداً. اختر البايت للبروتوكول ونقاط الشيفرة عند قصدها ومعالجة العناقيد للطول المرئي المطلوب. اختبر السياسة لا strlen عادةً.
أهم ما تعلمته
- اختر وحدة النص والترميز قبل فحص الطول.
- تحتاج نتائج البحث وسياقات الإخراج تفسيراً صريحاً.