يتم استخدام الكود التالي لترميز GB2312. يمثل اعتراض السلاسل الصينية مشكلة في PHP. الحل هو تحديد ما إذا كان حرفًا مزدوج البايت بناءً على ما إذا كانت القيمة أكبر من أو تساوي 128 لتجنب الأحرف المشوهة. ومع ذلك، توجد دائمًا مشاكل مثل الخلط بين الصينية والإنجليزية والرموز الخاصة وما إلى ذلك. والآن سأكتب مشكلة أكثر شمولاً كمرجع فقط:
وصف البرنامج:
1. تعتمد معلمة len على الأحرف الصينية. 1len يساوي حرفين إنجليزيين لجعل النموذج أكثر جمالاً
2. إذا تم تعيين المعلمة السحرية على خطأ، فسيتم التعامل مع اللغة الصينية والإنجليزية على قدم المساواة وسيتم أخذ العدد المطلق للأحرف.
3. مناسب بشكل خاص للسلاسل المشفرة باستخدام htmlspecialchars()
4. يمكن التعامل بشكل صحيح مع رمز برنامج وضع حرف الكيان (𖰰)
في GB2312:
الدالة FSubstr($title,$start,$len="",$magic=true)
{
/**
* مدعوم من Smartpig
* ميلتو: [email protected]
*/
طول $ = 0؛
if($len == "") $len = strlen($title);
// الحكم على أن موضع البداية غير صحيح
إذا($ابدأ > 0)
{
$cnum = 0;
ل($i=0;$i<$start;$i++)
{
if(ord(substr($title,$i,1)) >= 128) $cnum ++;
}
إذا($cnum%2 != 0) $start--;
غير محدد($cnum);
}
= 0
);
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
إذا($cur == "&")
{
إذا (substr($title,$i,4) == "<")
{
$cstep = 4;
$طول += 4;
$i += 3;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,4) == ">")
{
$cstep = 4;
$طول += 4;
$i += 3;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,5) == "&")
{
$cstep = 5;
$طول += 5;
$i += 4;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,6) == """)
{
$cstep = 6;
$طول += 6;
$i += 5;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,6) == "'")
{
$cstep = 6;
$طول += 6;
$i += 5;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}
}آخر{
إذا (أورد($cur)>=128)
{
$cstep = 2;
$طول += 2;
$i += 1;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}آخر{
$cstep = 1;
$طول +=1;
$realnum++;
إذا($السحر)
{
إذا (أورد($cur) >= 65 && أورد($cur) <= 90)
{
$ بلين++;
}آخر{
$ألين++;
}
}
}
}
إذا($السحر)
{
if(($blen*2+$alen) == ($len*2)) استراحة؛
إذا (($blen*2+$alen) == ($len*2+1))
{
إذا($ctype == 1)
{
$length -= $cstep;
استراحة؛
}آخر{
استراحة؛
}
}
}آخر{
إذا($realnum == $len) استراحة؛
}
}
unset($cur);
غير محدد($ألين);
غير محدد($بلين);
غير محدد($realnum);
غير محدد($ctype);
unset($cstep);
return substr($title,$start,$length);
}
هاها، سأقوم أيضًا بنشر رمز ترميز UTF-8 لاحقًا.