>  기사  >  백엔드 개발  >  PHP는 잘못된 문자 없이 한자를 자릅니다.

PHP는 잘못된 문자 없이 한자를 자릅니다.

王林
王林원래의
2019-09-17 13:03:413840검색

PHP는 잘못된 문자 없이 한자를 자릅니다.

PHP에서 substr() 함수가 중국어 문자열을 가로채면 문자가 깨져서 나타날 수 있습니다. 이는 중국어와 서양 문자에서 1바이트가 차지하는 바이트 수가 다르고 substr의 길이 매개 변수를 기반으로 하기 때문입니다. 문자의 경우, GB2312 인코딩에서는 한자 하나가 2바이트를 차지하고, UTF-8 인코딩에서는 한자 하나가 2~3바이트를 차지하고, 영어나 반각 구두점이 1바이트를 차지합니다. .1바이트.

한자를 가로채기 위해 PHP 함수 substr을 직접 사용하면 문자가 깨질 수 있습니다. 주된 이유는 substr이 한자를 강제로 반으로 "볼" 수 있기 때문입니다. 해결 방법:

1 문자가 왜곡되는 것을 방지하려면 mbstring 확장 라이브러리의 mb_substr 차단을 사용하세요.

2. 차단 기능을 직접 작성하지만 mbstring 확장 라이브러리를 사용하는 것만큼 효율성이 높지 않습니다.

3. 단지 가로채는 문자열을 출력하는 것이라면 substr($str, 0, 30).chr(0)과 같이 구현할 수 있습니다.

substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr()/mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll, php.ini에서 php_mbstring.dll을 열어야 합니다.

예:

<?php
echo mb_substr(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>
输出:这样一来我的字
<?php
echo mb_strcut(&#39;这样一来我的字符串就不会有乱码^_^&#39;, 0, 7, &#39;utf-8&#39;);
?>

출력: 다음과 같습니다.

위의 예에서 볼 수 있듯이 mb_substr은 문자를 단어로 분할하는 반면 mb_strcut은 문자를 바이트로 분할하지만 둘 다 반 문자 현상을 생성하지 않습니다.

PHP를 사용하여 잘못된 문자 없이 중국어 텍스트 문자열을 가로채는 방법

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
  $str=null;
  $len=$start+$length;
  for($i=$start;$i<$len;$i++){
  if(ord(substr($string,$i,1))>0xa0){
   $str.=substr($string,$i,2);
   $i++;
  }else{
   $str.=substr($string,$i,1);
  }
  }
  return $str.&#39;...&#39;;
}else{
  return $string;
}
}

깨진 문자 없이 중국어 텍스트 문자열을 가로채는 방법 - utf-8에 적합

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix="")
{
if(function_exists("mb_substr")){
return mb_substr($str, $start, $length, $charset).$suffix;
}
elseif(function_exists(&#39;iconv_substr&#39;)){
return iconv_substr($str,$start,$length,$charset).$suffix;
}
$re[&#39;utf-8&#39;] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re[&#39;gb2312&#39;] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re[&#39;gbk&#39;]  = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re[&#39;big5&#39;]  = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
return $slice.$suffix;
}

권장 튜토리얼: PHP 비디오 튜토리얼

위 내용은 PHP는 잘못된 문자 없이 한자를 자릅니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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