سؤال

أود أن أكتب محللًا (HTML) استنادًا إلى جهاز الحالة ، لكن لديّ شكوك في كيفية قراءة/استخدام إدخال. قررت تحميل المدخلات بأكملها في سلسلة واحدة ثم العمل معها كما هو الحال مع صفيف وأمسك فهرسه كموضع تحليل الحالي.

لن تكون هناك أي مشاكل في الترميز أحادي البايت ، ولكن في ترميز كل قيمة في كل قيمة لا تمثل حرفًا ، ولكن بايت من الحرف.

مثال:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}

المخرجات:

Ĺ
ž
Ĺ
Ą

هذا يعني أنه لا يمكنني التكرار من خلال السلسلة في حلقة للتحقق من الأحرف المفردة ، لأنني لا أعرف أبدًا ما إذا كنت في منتصف شخصية أم لا.

لذا فإن الأسئلة هي:

  • كيف يمكنني قراءة شخصية واحدة آمنة من سلسلة واحدة من سلسلة بطريقة ودية للأداء؟
  • هل من الجيد العمل مع السلسلة لأنها كانت صفيفًا في هذه الحالة؟
  • كيف تقرأ المدخلات؟
هل كانت مفيدة؟

المحلول

http://php.net/mb_string هو الشيء الذي تبحث عنه

  • فقط أحرف mb_substr واحدة تلو الأخرى
  • ليس حتى php6
  • ما المدخلات بالضبط؟ الطريقة المعتادة بشكل عام

نصائح أخرى

mb_internal_encoding("UTF-8");

$mb_string = 'žščř';

$l=mb_strlen($mb_string);

for($i=0;$i<$l;$i++){
    print(mb_substr($mb_string,$i,1)."<br/>");
}

دون استخدام MDB_ReledFunctions ومع السلاسل المشفرة متعددة البايت ، يمكنك استخدام وظائف السلسلة الفرعية القياسية التي تقرأ في مضاعفات البايتات المستخدمة للتشفير.

على سبيل المثال لسلسلة UTF-8 المشفرة (2 بايت) إذا كنت بحاجة إلى الحرف الأول من السلسلة

$string = 'žščř'; //4 multi-byte characters in UTF-8

يجب عليك الحصول على قيم $ string [0] و $ string [1] ، لذلك فأنت تبحث فعليًا عن السلسلة الفرعية بين الفهارس 0 و 1 (للشخصية الأولى).

لاحظ أن $ string [0] أو $ string [n] ستشير إلى الأول (أو البايت التاسع لسلسلة البايت المتعددة)

مع تحياتي،

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top