Процедура 1: PHP-метод перехвата китайских строк.
Поскольку при перехвате китайских строк на главной странице сайта и в vTigerCRM часто появляются искаженные символы (с использованием substr), сегодня я нашел лучший метод перехвата китайских строк и хотел бы поделиться им с вами. .
функция msubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
for($i = 0; $i <$strlen; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2);
$я++;
} еще
$tmpstr .= substr($str, $i, 1);
}
вернуть $tmpstr;
}
Программа 2: PHP перехватывает строку UTF-8 и решает проблему с половинными символами
/******************************** **** **********************************
* PHP перехватывает строки UTF-8, чтобы решить проблему с половинными символами.
* Английский язык и цифры (половинная ширина) — 1 байт (8 бит), китайский (полная ширина) — 3 байта.
* @return Извлеченная строка. Если $len меньше или равно 0, будет возвращена вся строка.
* @param $str исходная строка
* $len — длина подстроки слева
************************************************* * ******************/
функция utf_substr($str,$len)
{
for($i=0;$i<$len;$i++)
{
$temp_str=substr($str,0,1);
если(ord($temp_str) > 127)
{
$я++;
если($i<$len)
{
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}
еще
{
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
вернуть соединение ($ new_str);
}
?>
перехват строки php utf-8
<?
функция Cutstr($string, $length) {
preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef ][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80 -xbf][x80-xbf][x80-xbf]/", $string, $info);
for($i=0; $i<count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = ord($info[0][$i]) > 127 ? $j + 2: $j + 1;
если ($j > $длина - 3) {
вернуть $wordscut." ...";
}
}
return join('', $info[0]);
}
$string="242432 Оппозиция составляет 456 человек в широком местном посольстве 7890";
for($i=0;$i<strlen($string);$i++)
{
echo Cutstr($string,$i)."<br>";
}
?>
Функция перехвата строки UTF-8.
Для поддержки нескольких языков строка в базе данных может быть сохранена в кодировке UTF-8. При разработке веб-сайтов вам может потребоваться использовать PHP для перехвата части строки. Чтобы избежать искажения символов, напишите следующую функцию перехвата строк UTF-8.
Принцип работы UTF-8 см. в FAQ по UTF-8.
Символы в кодировке UTF-8 могут состоять из 1–3 байтов. определяется первым судят по байтам. (Теоретически могло быть и длиннее, но здесь предполагается не более 3 байт)
Если первый байт больше 224, он и 2 байта после него образуют символ UTF-8. Если первый байт больше 192 и меньше 224, он и 1 байт после него образуют символ UTF-8. Символ В противном случае первый байт представляет собой английский символ (включая цифры и небольшое количество знаков препинания).
Код, ранее разработанный для веб-сайта (также функция перехвата длины, используемая в настоящее время на главной странице)
Код:
<?php // Cut_Str;
//$sourcestr — строка, которую нужно обработать
//$cutlength — длина перехвата (т.е. количество слов)
функция Cut_str($sourcestr,$cutlength)
{
$returnstr='';
$ я = 0;
$п=0;
$str_length=strlen($sourcestr);//Количество байтов в строке
while (($n<$cutlength) и ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//Получаем ascii-код $i-го символа в строке
if ($ascnum>=224) //Если бит ASCII высокий и равен 224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3 //Согласно спецификации кодировки UTF-8, 3 последовательных символа считаются одним символом;
$i=$i+3; //Фактический байт считается как 3
$n++; //Длина строки считается как 1
}
elseif ($ascnum>=192) //Если бит ASCII высокий и равен 192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2 //Согласно спецификации кодировки UTF-8, 2 последовательных символа считаются одним символом;
$i=$i+2; //Фактический байт считается как 2
$n++; //Длина строки считается как 1
}
elseif ($ascnum>=65 && $ascnum<=90) //Если это заглавная буква,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //Фактическое количество байтов по-прежнему считается 1;
$n++; //Но, учитывая общий вид, прописные буквы считаются одним старшим битовым символом
}
else //В остальных случаях включайте строчные буквы и полуширинные знаки препинания,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //Фактическое количество байт равно 1
$n=$n+0.5; //Строчные буквы и знаки препинания половинной ширины составляют половину ширины символов старшего порядка...
}
}
если ($str_length>$cutlength){
$returnstr = $returnstr "...";//Добавляем многоточие в конце, когда длина превышает длину.
}
return $returnstr;
}
Перехватить строковую
функцию utf-8 FSubstr($title,$start,$len="",$magic=true)
{
/**
* на базе Smartpig
* почта: [email protected]
*/
if($len == "") $len=strlen($title);
если ($ старт! = 0)
{
$startv = ord(substr($title,$start,1));
если ($ startv >= 128)
{
если($startv <192)
{
for($i=$start-1;$i>0;$i--)
{
$tempv = ord(substr($title,$i,1));
if($tempv >= 192) перерыв;
}
$начало = $я;
}
}
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$ален = 0;
$блэн = 0;
$реальный номер = 0;
for($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(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)>=252)
{
$cстеп = 6;
$длина += 6;
$я += 5;
$реальный номер++;
если ($ магия)
{
$блен++;
$cтип = 1;
}
}elseif(ord($cur)>=248){
$cстеп = 5;
$длина += 5;
$я += 4;
$реальный номер++;
если ($ магия)
{
$cтип = 1;
$блен++;
}
}elseif(ord($cur)>=240){
$cстеп = 4;
$длина += 4;
$я += 3;
$реальный номер++;
если ($ магия)
{
$блен++;
$cтип = 1;
}
}elseif(ord($cur)>=224){
$cстеп = 3;
$длина += 3;
$я += 2;
$реальный номер++;
если ($ магия)
{
$cтип = 1;
$блен++;
}
}elseif(ord($cur)>=192){
$cстеп = 2;
$длина += 2;
$я += 1;
$реальный номер++;
если ($ магия)
{
$блен++;
$cтип = 1;
}
}elseif(ord($cur)>=128){
$длина += 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) перерыв;
}
}
не установлено ($cur);
не установлено ($ Ален);
не установлено ($ blen);
не установлено ($ Realnum);
не установлено ($ cтип);
не установлено ($ cstep);
return substr($title,$start,$length);
}