شرح صفوف ومحتوى الفقرة
مع النصوص العربية والعالمية المرمزة بـ UTF-8، استخدم دائماً mb_strpos() وmb_substr() ليتم حساب الفهارس والأطوال بالأحرف الحقيقية وليس بالبايتات الخام.
- يشغل كل حرف عربي في ترميز UTF-8 بايتين؛ لذا فإن
substr($ar, 0, 3)تأخذ 3 بايتات (حرفاً ونصف) فتُتلف الحرف الثاني! - تقتطع
mb_substr($ar, 0, 3, "UTF-8")أول 3 أحرف عربية كاملة وسليمة. - تُرجع
mb_strpos($ar, $word, 0, "UTF-8")الفهرس الحرفي الصحيح للتطابق.
الكلمة العربية المكونة من 7 أحرف تشغل 14 بايت في UTF-8؛ وتقتطع mb_substr(..., 0, 2, "UTF-8") أول حرفين عربيين بأمان (4 بايتات).
PHP
<?php
$arabicCity = "\xD8\xA7\xD9\x84\xD9\x82\xD8\xA7\xD9\x87\xD8\xB1\xD8\xA9";
$byteLen = strlen($arabicCity);
$charLen = mb_strlen($arabicCity, "UTF-8");
$prefix = mb_substr($arabicCity, 0, 2, "UTF-8");
echo "Bytes: $byteLen | Chars: $charLen\n";
echo "Prefix bytes: " . strlen($prefix) . "\n";