Следующий код используется для кодировки GB2312. Перехват китайских строк — головная боль в PHP. Решение состоит в том, чтобы определить, является ли это двухбайтовым символом, на основе того, больше или равно ли значение 128, чтобы избежать искажения символов. Однако такие проблемы, как смешение китайского и английского языков, специальные символы и т. д., сейчас напишу более полную только для справки:
Описание программы:
1. Параметр len основан на китайских иероглифах. 1len равен 2 английским символам. Чтобы сделать форму более красивой.
2. Если для магического параметра установлено значение false, китайский и английский будут обрабатываться одинаково, и будет взято абсолютное количество символов.
3. Особенно подходит для строк, закодированных с помощью htmlspecialchars().
4. Может правильно обрабатывать программный код режима символов объекта (𖰰)
в GB2312:
функция FSubstr($title,$start,$len="",$magic=true)
{
/**
* на базе Smartpig
* почта: [email protected]
*/
$длина = 0;
if($len == "") $len = strlen($title);
//Считаем, что начальная позиция неверна;
если ($ начало > 0)
{
$cnum = 0;
for($i=0;$i<$start;$i++)
{
if(ord(substr($title,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $start--;
не установлено ($ cnum);
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$alen = 0;
$blen = 0;
$realnum = 0;
для ($i=$start;$i<strlen($title);$i++)
{
$cтип = 0;
$cстеп = 0;
$cur = substr($title,$i,1);
если($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cстеп = 4;
$длина += 4;
$я += 3;
$реальный номер++;
если ($ магия)
{
$ален++;
}
}
иначе if(substr($title,$i,4) == ">")
{
$cстеп = 4;
$длина += 4;
$я += 3;
$реальный номер++;
если ($ магия)
{
$ален++;
}
}
иначе if(substr($title,$i,5) == "&")
{
$cстеп = 5;
$длина += 5;
$я += 4;
$реальный номер++;
если ($ магия)
{
$ален++;
}
}
иначе if(substr($title,$i,6) == """)
{
$cстеп = 6;
$длина += 6;
$я += 5;
$реальный номер++;
если ($ магия)
{
$ален++;
}
}
иначе if(substr($title,$i,6) == "'")
{
$cстеп = 6;
$длина += 6;
$я += 5;
$реальный номер++;
если ($ магия)
{
$ален++;
}
}
иначе if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$реальный номер++;
если ($ магия)
{
$блен++;
$cтип = 1;
}
}
}еще{
если(ord($cur)>=128)
{
$cстеп = 2;
$длина += 2;
$я += 1;
$реальный номер++;
если ($ магия)
{
$блен++;
$cтип = 1;
}
}еще{
$cстеп = 1;
$длина +=1;
$реальный номер++;
если ($ магия)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$блен++;
}еще{
$ален++;
}
}
}
}
если ($ магия)
{
if(($blen*2+$alen) == ($len*2)) перерыв;
if(($blen*2+$alen) == ($len*2+1))
{
если ($ cтип == 1)
{
$длина -= $cstep;
перерыв;
}еще{
перерыв;
}
}
}еще{
если ($realnum == $len) перерыв;
}
}
Unset ($cur);
не установлено ($ Ален);
не установлено ($ blen);
не установлено ($ Realnum);
не установлено ($ cтип);
unset($cstep);
return substr($title,$start,$length);
}
Ха-ха, код кодировки UTF-8 я также опубликую позже.