비교적 사용하기 쉬운 문자열 차단 기능:
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 = '我是一串比较长的中文不带英文'; $str2 = '我是一串比较长的中文带yingwen'; $len = strlen($str1); echo '<br />'.$len; //return 28 $len = strlen($str2); echo '<br />'.$len; //return 29 echo '<br />'; echo substring($str1, 0, 11); echo '<br />'; echo substring($str2, 0, 11); echo '<br />'; echo substring($str1, 16, 28); echo '<br />'; 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('00000000'.$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('00000000'.$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[ ] = ''; } 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 중국어 웹사이트에 주목하세요!