>백엔드 개발 >PHP 튜토리얼 >PHP Substr 왜곡 문제를 해결하는 방법

PHP Substr 왜곡 문제를 해결하는 방법

小云云
小云云원래의
2017-11-11 11:20:393704검색

php substr은 문자열의 일부를 반환할 수 있는 PHP 언어를 기반으로 개발된 기능적 함수입니다. 때때로 php substr을 사용할 때 일부 잘못된 문자가 나타날 수 있습니다. 어떻게 해결합니까?

string substr ( string $string , int $start [, int $length ] )

문자열의 시작 위치부터 시작하는 길이의 문자열을 반환합니다.

substr 함수는 문자를 바이트 단위로 가로챕니다. 한자는 GB2312로 인코딩하면 2바이트, 인코딩하면 utf-8이므로 한자가 잘립니다. 지정된 길이의 문자열을 가로채면 반환된 결과가 표시될 때 왜곡됩니다.

확인 후 해결 방법은 두 가지 범주로 요약될 수 있습니다.

1. 대신 mb_substr() 함수를 사용하세요

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

substr() 함수와 유사하지만 계산은 보장할 문자 수를 기준으로 합니다. 문자 안전

mb_substr 사용 () 함수를 사용하면 문자가 깨지는 것을 방지할 수 있지만, 길이 통계가 바이트 수가 아닌 문자 수에 대한 통계가 된다는 단점이 있습니다. 표시용으로 사용하는 경우 동일한 길이의 중국어 결과와 영어 결과 간에 표시 길이에 큰 차이가 있습니다.

2. substr 기능을 강화하는 자체 구축 기능

한자와 만나는 substr 문제를 더 잘 해결할 수 있는 기능이 있습니다. 중국어 문자는 2개의 길이 단위로 계산되므로 중국어와 영어가 혼합된 환경에서 문자열 가로채기의 최종 표시 길이가 가까워집니다. 마지막 불완전 문자는 디스플레이에 잘못된 문자가 없는지 확인하기 위해 삭제됩니다. 한자에 일반적으로 사용되는 UTF와 호환됩니다. -8 인코딩과 GB2312 인코딩은 다양성이 뛰어납니다.

소스 코드 보기

  function getstr($string, $length, $encoding  = 'utf-8') {    
 $string = trim($string);    
 if($length && strlen($string) > $length) {    
  //截断字符    
  $wordscut = '';    
  if(strtolower($encoding) == 'utf-8') {    
  //utf8编码    
   $n = 0;    
  $tn = 0;    
 $noc = 0;    
 while ($n < strlen($string)) {    
  $t = ord($string[$n]);    
 if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {    
 $tn = 1;    
 $n++;    
  $noc++;    
 } elseif(194 <= $t && $t <= 223) {    
 $tn = 2;    
 $n += 2;    
} elseif(224 <= $t && $t < 239) {    
  $tn = 3;    
  $n += 3;    
  $noc += 2;    
 } elseif(240 <= $t && $t <= 247) {    
 $tn = 4;    
 $n += 4;    
 $noc += 2;    
 } elseif(248 <= $t && $t <= 251) {    
  $tn = 5;    
$n += 5;    
   $noc += 2;    
 } elseif($t == 252 || $t == 253) {    
 $tn = 6;    
   $n += 6;    
   $noc += 2;    
  } else {    
 $n++;    
}    
 if ($noc >= $length) {    
break;    
 }    
}    
 if ($noc > $length) {    
$n -= $tn;    
  }    
 $wordscut = substr($string, 0, $n);    
 } else {    
 for($i = 0; $i < $length - 1; $i++) {    
  if(ord($string[$i]) > 127) {    
$wordscut .= $string[$i].$string[$i + 1];    
$i++;    
 } else {    
   $wordscut .= $string[$i];    
  }    
 }    
  }    
$string = $wordscut;    
 }    
return trim($string);    
 }    
 // 示例    
 echo getstr("0一二三四五六七",1).&#39;<br />&#39;;  // 0    
 echo getstr("0一二三四五六七",2).&#39;<br />&#39;;  // 0    
echo getstr("0一二三四五六七",3).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",4).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",5).&#39;<br />&#39;;  // 0一二    
 echo getstr("0一a二b三四五六七",1).&#39;<br />&#39;;    // 0    
  echo getstr("0一a二b三四五六七",2).&#39;<br />&#39;;    // 0    
 echo getstr("0一a二b三四五六七",3).&#39;<br />&#39;;    // 0一    
 echo getstr("0一a二b三四五六七",4).&#39;<br />&#39;;    // 0一a    
  echo getstr("0一a二b三四五六七",5).&#39;<br />&#39;;    // 0一a

이 함수는 UCHome 1.5의 getstr() 함수에서 수정되었습니다.

위 내용은 php substr의 왜곡된 문제를 해결하는 방법에 대한 솔루션입니다. 이전에 php substr 기능에 대한 일련의 기사도 공유한 적이 있습니다. 필요한 경우 PHP 중국어 웹사이트에 주목할 수 있습니다.

관련 권장사항:

PHP substr() 함수에 대한 여러 프로그램

php substr() 함수 처리 중국어 상세 설명

php substr() 함수 문자열 차단 사용 예 설명


위 내용은 PHP Substr 왜곡 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.