خبرة technical

احسب العدد الدقيق لمقاطع الرسائل القصيرة قبل الإرسال: الصيغة والرمز (PHP/JS/Python)

احسب عدد مقاطع الرسائل القصيرة قبل الإرسال: دليل تقني مع أمثلة التعليمات البرمجية للمطورين في المغرب.

احسب العدد الدقيق لمقاطع الرسائل القصيرة قبل الإرسال: الصيغة والرمز (PHP/JS/Python)
محتويات هذا المقال
  1. أحد الأخطاء الأكثر شيوعًا عند دمج [SMS API في المغرب](/fr/api-sms-maroc/) هو الشحن الزائد غير المتوقع المتعلق بالتشفير. أنت ترسل حملة مكونة من 10000 رسالة باللغة الدارية، ويفرض عليك مزود الخدمة 30000 رصيدًا. لماذا ؟ لأن الرسائل القصيرة لا تتم محاسبتها "لكل رسالة"، بل "لكل مقطع".
  2. صيغة حساب القطاعات
  3. اكتشاف GSM-7 مقابل UCS-2 تلقائيًا في الكود
  4. مقتطف PHP (جاهز للاستخدام)
  5. مقتطف Node.js/جافا سكريبت

أحد الأخطاء الأكثر شيوعًا عند دمج [SMS API في المغرب](/fr/api-sms-maroc/) هو الشحن الزائد غير المتوقع المتعلق بالتشفير. أنت ترسل حملة مكونة من 10000 رسالة باللغة الدارية، ويفرض عليك مزود الخدمة 30000 رصيدًا. لماذا ؟ لأن الرسائل القصيرة لا تتم محاسبتها "لكل رسالة"، بل "لكل مقطع".

إذا كنت تقوم بإنشاء نظام إدارة علاقات العملاء (CRM) داخليًا أو تطبيق أعمال، فيجب عليك بالتأكيد أن تعرض للمستخدمين عدد الشرائح التي هم على وشك استهلاكها قبل أن ينقروا على "إرسال".

فيما يلي المواصفات الفنية (GSM 03.38) والكود لتنفيذ عداد شرائح قوي في تطبيقاتك.

صيغة حساب القطاعات

يقتصر وزن الرسالة النصية القصيرة (SMS) بواسطة شبكة الاتصالات على 140 ثمانيًا (بايت). تعتمد سعة الحرف على كيفية استخدام هذه البايتات (الترميز):

1. ترميز GSM-7 (الأبجدية القياسية)

يستخدم للأحرف اللاتينية الكلاسيكية (a-z، A-Z، 0-9) وبعض علامات الترقيم الأساسية.

  • كل حرف يأخذ 7 بتات.
  • الحد الأقصى لحجم المقطع الواحد: 160 حرفًا.
  • الحجم إذا كان متسلسلاً (> مقطع واحد): 153 حرفًا لكل مقطع (7 أحرف محجوزة لرأس بيانات المستخدم - UDH، الذي يسمح للهاتف بتجميع الأجزاء معًا).

2. ترميز UCS-2 (Unicode).

مطلوبة إذا كانت رسالتك تحتوي على حرف عربي واحد أو رمز تعبيري (🚀) أو لهجة معقدة (œ).

  • كل حرف يأخذ 16 بت.
  • الحد الأقصى لحجم المقطع الواحد: 70 حرفًا.
  • الحجم إذا كان متسلسلاً (> مقطع واحد): 67 حرفًا لكل مقطع (3 أحرف محجوزة لـ UDH).

اكتشاف GSM-7 مقابل UCS-2 تلقائيًا في الكود

تتم خوارزمية الحساب في 3 خطوات:

  1. تحليل كل حرف من النص.
  2. إذا كانت جميع الأحرف تنتمي إلى أبجدية GSM-7، فاستخدم الحد 160/153.
  3. إذا كان الحرف المفرد لا ينتمي إلى هناك، فافرض الأبجدية UCS-2 واستخدم الحد 70/67.

ملاحظة: بعض أحرف GSM-7 "الممتدة" (مثل €، [، ]، ~) تُحسب بشكل مزدوج. الوظيفة الجيدة يجب أن تأخذها بعين الاعتبار.

مقتطف PHP (جاهز للاستخدام)

فيما يلي تطبيق PHP خفيف الوزن، مثالي لواجهات Laravel الخلفية:

php
function calculateSmsSegments($text) {
    // Alphabet GSM-7 standard + Extension
    $gsm7Chars = "@£\$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà";
    $gsm7Extended = "^{}\\[~]|€";
    
    $isGSM = true;
    $length = 0;
    
    // Détection de l'encodage et calcul de la longueur
    $chars = preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY);
    foreach ($chars as $char) {
        if (mb_strpos($gsm7Extended, $char) !== false) {
            $length += 2; // Compte double
        } elseif (mb_strpos($gsm7Chars, $char) !== false) {
            $length += 1;
        } else {
            // Caractère hors GSM-7 trouvé (ex: Arabe, Emoji)
            $isGSM = false;
            $length = mb_strlen($text, 'UTF-8');
            break;
        }
    }
    
    if ($isGSM) {
        if ($length <= 160) return 1;
        return ceil($length / 153);
    } else {
        if ($length <= 70) return 1;
        return ceil($length / 67);
    }
}

// Tests
echo calculateSmsSegments("Test simple GSM7"); // Retourne 1
echo calculateSmsSegments("Test en arabe مرحبا"); // Retourne 1 (passe en UCS2, mais <70)
echo calculateSmsSegments(str_repeat("مرحبا بكم في خدمة الرسائل القصيرة", 3)); // Retourne 2 ou 3 selon la longueur exacte

مقتطف Node.js/جافا سكريبت

بالنسبة للواجهة الأمامية لـ React/Vue (لعرض العداد المباشر أثناء الكتابة):

javascript
function getSmsSegments(text) {
    const gsm7Regex = /^[@£$¥èéùìòÇ\nØø\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"\#¤%&'()*+,\-.\/0-9:;<=>?¡A-ZÄÖÑܧ¿a-zäöñüà\^\{\}\\[~\]|€]*$/;
    
    // Détecter si le texte est entièrement en GSM-7
    const isGsm7 = gsm7Regex.test(text);
    
    // Calcul de la longueur (les caractères étendus comme € comptent pour 2)
    let length = text.length;
    if (isGsm7) {
        const extendedRegex = /[\^\{\}\\[~\]|€]/g;
        const matches = text.match(extendedRegex);
        if (matches) {
            length += matches.length;
        }
    }
    
    if (isGsm7) {
        if (length <= 160) return 1;
        return Math.ceil(length / 153);
    } else {
        // Mode UCS-2 (Unicode) - Attention avec JavaScript et les emojis (Surrogate pairs)
        // Array.from(text).length donne le compte exact d'emojis complexes
        const unicodeLength = Array.from(text).length;
        if (unicodeLength <= 70) return 1;
        return Math.ceil(unicodeLength / 67);
    }
}

console.log(`Segments: \${getSmsSegments("Vos soldes sont ouverts 🚀")}`); // Segments: 1 (UCS-2)

لا ترسل حملاتك بشكل أعمى أبدًا. سيؤدي تطبيق هذا المنطق في تطبيقك إلى إنقاذك أنت وعملائك المغاربة من فواتير SMS API الخارجة عن السيطرة.

لماذا تختار EnvoiSMS لشركتك؟

التوصيل نحو المشغلين

مسارات محلية نحو اتصالات المغرب وأورنج وإنوي، مع تحويل تلقائي بين المسارات وإرسال حالة التسليم عبر webhook.

تحسين الميزانية

واجهة برمجة تطبيقات WhatsApp Business ابتداءً من 0.65 درهم لكل رسالة. أفضل عائد على الاستثمار.

سيادة البيانات (CNDP)

استضافة ومعالجة متوافقة تماماً مع لوائح حماية المعطيات ذات الطابع الشخصي CNDP.

ما هو زمن الوصول للتوجيه على شبكات IAM وInwi وOrange؟
على مساراتنا المحلية نحو اتصالات المغرب (IAM) وأورنج وإنوي، يتراوح متوسط زمن التسليم بين 2 و4 ثوانٍ لتدفقات المعاملات.
كيف تدير المنصة تنسيق الأرقام المغربية؟
يقوم EnvoiSMS تلقائيًا بتسوية الأرقام المدخلة (06..., 07..., 00212...) إلى معيار E.164 (+212) لتجنب أي فشل في التسليم.

مقالات مقترحة

تنسيق الرسائل القصيرة في المغرب: فواصل الأسطر، تشفير GSM-7 مقابل UCS-2 وتحسين التكلفة
technical

تنسيق الرسائل القصيرة في المغرب: فواصل الأسطر، تشفير GSM-7 مقابل UCS-2 وتحسين التكلفة

تنسيق واتساب للأعمال في المغرب: نص معزز ورموز تعبيرية وأزرار تفاعلية
technical

تنسيق واتساب للأعمال في المغرب: نص معزز ورموز تعبيرية وأزرار تفاعلية

التحقق عبر واتساب بنقرة واحدة وتعبئة تلقائية One-Tap Autofill OTP في المغرب
technical

التحقق عبر واتساب بنقرة واحدة وتعبئة تلقائية One-Tap Autofill OTP في المغرب