절차 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);
$i++;
} 또 다른
$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);
if(ord($temp_str) > 127)
{
$i++;
if($i<$len)
{
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}
또 다른
{
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
return Join($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;
if ($j > $length - 3) {
$wordscut을 반환합니다." ...";
}
}
return Join('', $info[0]);
}
$string="242432 반대는 광범위한 대사관 지역 7890에 대한 456 헌신입니다";
for($i=0;$i<strlen($string);$i++)
{
echo cutstr($string,$i)."<br>";
}
?>
UTF-8 문자열 함수 가로채기
여러 언어를 지원하기 위해 데이터베이스의 문자열이 UTF-8 인코딩으로 저장될 수 있습니다. 웹 사이트 개발에서는 문자열의 일부를 가로채기 위해 PHP를 사용해야 할 수도 있습니다. 문자가 왜곡되는 것을 방지하려면 UTF-8 문자열 차단 기능을 다음과 같이 작성하세요.
UTF-8 FAQ를 참조하세요.
UTF-8로 인코딩된 문자는 1~3바이트로 구성될 수 있습니다. 바이트로 판단한 첫 번째로 결정됩니다. (이론적으로는 더 길 수도 있지만 여기서는 3바이트 이하로 가정합니다.)
첫 번째 바이트가 224보다 크면 이 바이트와 그 뒤의 2바이트가 UTF-8 문자를 형성합니다. 첫 번째 바이트가 192보다 크고 224보다 작으면 이 바이트와 그 뒤의 1바이트가 UTF-8 문자를 형성합니다. 문자 그렇지 않은 경우 첫 번째 바이트 자체는 영어 문자입니다(숫자 및 약간의 구두점 포함).
이전에 웹사이트용으로 설계된 코드(현재 홈페이지에서 사용되는 길이 차단 기능이기도 함)
암호:
<?php // Cut_Str;
//$sourcestr은 처리할 문자열입니다.
//$cutlength는 가로채기 길이(즉, 단어 수)입니다.
함수 cut_str($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//문자열의 바이트 수
동안 (($n<$cutlength) 및 ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//문자열에서 $i번째 문자의 ASCII 코드를 가져옵니다.
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; //소문자와 반각 구두점은 상위 문자 폭의 절반입니다...
}
}
if ($str_length>$cutlength){
$returnstr = $returnstr . "...";//길이를 초과하면 끝에 줄임표를 추가합니다.
}
return $returnstr;
}
utf-8 문자열 함수
FSubstr($title,$start,$len="",$magic=true)
가로채기
{
/**
* Smartpig 제공
* 메일 수신:[email protected]
*/
if($len == "") $len=strlen($title);
if($시작 != 0)
{
$startv = ord(substr($title,$start,1));
if($startv >= 128)
{
if($startv < 192)
{
for($i=$start-1;$i>0;$i--)
{
$tempv = ord(substr($title,$i,1));
if($tempv >= 192) 중단;
}
$시작 = $i;
}
}
}
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);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$c단계 = 4;
$길이 += 4;
$i += 3;
$리얼넘++;
if($매직)
{
$alen++;
}
}
else if(substr($title,$i,4) == ">")
{
$c단계 = 4;
$길이 += 4;
$i += 3;
$리얼넘++;
if($매직)
{
$alen++;
}
}
else if(substr($title,$i,5) == "&")
{
$c단계 = 5;
$길이 += 5;
$i += 4;
$리얼넘++;
if($매직)
{
$alen++;
}
}
else if(substr($title,$i,6) == """)
{
$c단계 = 6;
$ 길이 += 6;
$i += 5;
$리얼넘++;
if($매직)
{
$alen++;
}
}
else if(preg_match("/&#(d+);?/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$리얼넘++;
if($매직)
{
$blen++;
$ctype = 1;
}
}
}또 다른{
if(ord($cur)>=252)
{
$c단계 = 6;
$ 길이 += 6;
$i += 5;
$리얼넘++;
if($매직)
{
$blen++;
$ctype = 1;
}
}elseif(ord($cur)>=248){
$c단계 = 5;
$길이 += 5;
$i += 4;
$리얼넘++;
if($매직)
{
$ctype = 1;
$blen++;
}
}elseif(ord($cur)>=240){
$c단계 = 4;
$길이 += 4;
$i += 3;
$리얼넘++;
if($매직)
{
$blen++;
$ctype = 1;
}
}elseif(ord($cur)>=224){
$c단계 = 3;
$길이 += 3;
$i += 2;
$리얼넘++;
if($매직)
{
$ctype = 1;
$blen++;
}
}elseif(ord($cur)>=192){
$c단계 = 2;
$길이 += 2;
$i += 1;
$리얼넘++;
if($매직)
{
$blen++;
$ctype = 1;
}
}elseif(ord($cur)>=128){
$ 길이 += 1;
}또 다른{
$c단계 = 1;
$길이 +=1;
$리얼넘++;
if($매직)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}또 다른{
$alen++;
}
}
}
}
if($매직)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$길이 -= $c단계;
부서지다;
}또 다른{
부서지다;
}
}
}또 다른{
if($realnum == $len) 중단;
}
}
설정되지 않음($cur);
설정되지 않음($alen);
설정되지 않음($blen);
설정되지 않음($realnum);
설정 해제($ctype);
설정 해제($cstep);
return substr($title,$start,$length);
}