> 백엔드 개발 > PHP 튜토리얼 > 잘못된 솔루션 없이 PHP 중국어 문자열 잘림

잘못된 솔루션 없이 PHP 중국어 문자열 잘림

高洛峰
풀어 주다: 2023-03-03 17:34:01
원래의
1313명이 탐색했습니다.

비교적 사용하기 쉬운 문자열 차단 기능:

function substring($str, $start, $length){ //比较好用字符串截取函数
  $len = $length;
  if($length < 0){
  $str = strrev($str);
  $len = -$length;
  }
  $len= ($len < strlen($str)) ? $len : strlen($str);
  $tmpstr = "";
  for ($i= $start; $i < $len; $i ++)
  {
      if (ord(substr($str, $i, 1)) > 0xa0)
      {
       $tmpstr .= substr($str, $i, 2);
       $i++;
      } else {
       $tmpstr .= substr($str, $i, 1);
      }
  }
  if($length < 0) $tmpstr = strrev($tmpstr);
  return $tmpstr;
}
로그인 후 복사

사용 예:

$str1 = &#39;我是一串比较长的中文不带英文&#39;;
$str2 = &#39;我是一串比较长的中文带yingwen&#39;;
 
 
$len = strlen($str1);
echo &#39;<br />&#39;.$len; //return 28
 
$len = strlen($str2);
echo &#39;<br />&#39;.$len; //return 29
 
echo &#39;<br />&#39;; 
echo substring($str1, 0, 11); 
echo &#39;<br />&#39;;
echo substring($str2, 0, 11);   
echo &#39;<br />&#39;;
echo substring($str1, 16, 28); 
echo &#39;<br />&#39;;
echo substring($str2, 16, 29);
로그인 후 복사

결과는 다음과 같습니다.

28
29
나는 비교의 문자열입니다
나는 비교의 문자열입니다
영어 없는 중국어
중국어 yingwen

과 함께 사용하는 이 기능은 매우 유용합니다. 예를 들어 비교적 긴 파일 이름을 자르는 데 사용되지만 중간에...를 추가하면 됩니다.

function formatName($str, $size){
  $len = strlen($str);
  if(strlen($str) > $size) {
    $part1 = substring($str, 0, $size / 2);
    $part2 = substring($str, $len - ($size/2), $len);
    return $part1 . "..." . $part2;
  } else {
    return $str;
  }
}
로그인 후 복사

그리고 인터넷에서 아주 간단한 중국어 잘림 해결 방법을 보고 시도해 보았는데 잘 작동했습니다.

echo substr($str1,0,10 ).chr(0);

원리 설명:

chr(0)은 null이 아닙니다.
07null은 아무 의미도 없습니다. , chr(0)의 값은 0입니다. 16진수로 표현하면 0x00, 2진수로 표현하면 00000000
08 chr(0)은 아무것도 표시하지 않지만 문자입니다.
09 한자가 잘리면 인코딩 규칙에 따라 항상 뒤에 있는 다른 문자를 한자로 끌어와서 해석해야 하는 이유가 바로 이 때문입니다. 0x81~0xff 및 0x00 값의 조합은 항상 "비어 있음"으로 표시됩니다
10이 기능에 따르면 substr 결과 뒤에 chr(0)을 추가하면 문자 깨짐을 방지할 수 있습니다

---- ------------------------

20120705 업데이트:

이상 방법은 그래도 가끔 문자가 깨져서 나타나는 현상이 나타나며 그 이유는 아직 조사되지 않았습니다. 그러나 UTF8 문자 텍스트에 대해 시도 및 테스트된 다음 방법을 사용할 수 있습니다.
참고: 이 방법에서는 한자가 1단위 길이로 계산되고, 영문자 1개가 1단위 길이로 계산되므로 자를 때 길이 설정에 주의해야 합니다.
길이 계산 방법:

function strlen_UTF8($str)
{
  $len = strlen($str);
  $n = 0;
  for($i = 0; $i < $len; $i++) {
    $x = substr($str, $i, 1);
    $a = base_convert(ord($x), 10, 2);
    $a = substr(&#39;00000000&#39;.$a, -8);
    if (substr($a, 0, 1) == 0) {
    }elseif (substr($a, 0, 3) == 110) {
      $i += 1;
    }elseif (substr($a, 0, 4) == 1110) {
      $i += 2;
    }
    $n++;
  }
  return $n;
} // End strlen_UTF8;
로그인 후 복사

문자열 잘림 기능:

function subString_UTF8($str, $start, $lenth)
  {
    $len = strlen($str);
    $r = array();
    $n = 0;
    $m = 0;
    for($i = 0; $i < $len; $i++) {
      $x = substr($str, $i, 1);
      $a = base_convert(ord($x), 10, 2);
      $a = substr(&#39;00000000&#39;.$a, -8);
      if ($n < $start){
        if (substr($a, 0, 1) == 0) {
        }elseif (substr($a, 0, 3) == 110) {
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $i += 2;
        }
        $n++;
      }else{
        if (substr($a, 0, 1) == 0) {
          $r[ ] = substr($str, $i, 1);
        }elseif (substr($a, 0, 3) == 110) {
          $r[ ] = substr($str, $i, 2);
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $r[ ] = substr($str, $i, 3);
          $i += 2;
        }else{
          $r[ ] = &#39;&#39;;
        }
        if (++$m >= $lenth){
          break;
        }
      }
    }
    return join($r);
  } // End subString_UTF8;
로그인 후 복사

사용 방법은 앞서 소개한 것과 동일합니다. 예를 들어 formatName은 다음과 같이 구현할 수 있습니다(한자 길이가 약간 최적화됨).

function formatName($str, $size){
 $len = strlen_UTF8($str);
 $one_len = strlen($str);
 $size = $size * 1.5 * $len / ($one_len);
 if(strlen_UTF8($str) > $size) {
  $part1 = subString_UTF8($str, 0, $size / 2);
  $part2 = subString_UTF8($str, $len - ($size/2), $len);
  return $part1 . "..." . $part2;
 } else {
  return $str;
 }
}
로그인 후 복사

위 내용이 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바랍니다.

잘못된 코드 솔루션이 없는 PHP 중국어 문자열 잘림과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿