이 글은 주로 스마트하게 중국어와 영어 다중 코드 문자를 가로채는 문제에 대한 해결책을 소개합니다. 여기에는 원래의 smartTruncate를 수정하는 내용이 포함되어 있어 도움이 필요한 친구들이 참고할 수 있습니다. 🎜>
본 글에서는 스마트티를 이용하여 중국어, 영어 멀티인코딩 문자에서 깨져있는 문자를 가로채는 문제에 대한 해결 방법을 찾아낸 예시를 설명하고 있으며, 참고용으로 공유하고자 합니다. 구체적인 방법은 다음과 같습니다. 일반 웹사이트 페이지 표시에는 필연적으로 부분 문자열이 가로채어지게 됩니다. 이때 truncate가 유용하지만, 영어 사용자에게만 적합합니다. 잘림으로 인해 문자가 깨질 수 있으며, 중국어와 영어가 혼합된 문자열의 경우 동일한 수의 문자열을 가로채면 실제 표시 길이가 달라져 시각적으로 고르지 않게 나타나 모양에 영향을 줍니다. 한자의 길이가 대략 영어 두 글자의 길이와 같기 때문이다. 또한 truncate는 GB2312, UTF-8 및 기타 인코딩과 동시에 호환되지 않습니다.smartTruncate 개선: 파일 이름: modifier.smartTruncate.php
구체 코드는 다음과 같습니다.
<?php function smartDetectUTF8($string) { static $result = array(); if(! array_key_exists($key = md5($string), $result)) { $utf8 = " /^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )+$/xs "; $result[$key] = preg_match(trim($utf8), $string); } return $result[$key]; } function smartStrlen($string) { $result = 0; $number = smartDetectUTF8($string) ? 3 : 2; for($i = 0; $i < strlen($string); $i += $bytes) { $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $result += $bytes > 1 ? 1.0 : 0.5; } return $result; } function smartSubstr($string, $start, $length = null) { $result = ''''; $number = smartDetectUTF8($string) ? 3 : 2; if($start < 0) { $start = max(smartStrlen($string) + $start, 0); } for($i = 0; $i < strlen($string); $i += $bytes) { if($start <= 0) { break; } $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $start -= $bytes > 1 ? 1.0 : 0.5; } if(is_null($length)) { $result = substr($string, $i); } else { for($j = $i; $j < strlen($string); $j += $bytes) { if($length <= 0) { break; } if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1) { if($length < 1.0) { break; } $result .= substr($string, $j, $bytes); $length -= 1.0; } else { $result .= substr($string, $j, 1); $length -= 0.5; } } } return $result; } function smarty_modifier_smartTruncate($string, $length = 80, $etc = ''...'', $break_words = false, $middle = false) { if ($length == 0) return ''''; if (smartStrlen($string) > $length) { $length -= smartStrlen($etc); if (!$break_words && !$middle) { $string = preg_replace(''/\s+?(\S+)?$/'', '''', smartSubstr($string, 0, $length+1)); } if(!$middle) { return smartSubstr($string, 0, $length).$etc; } else { return smartSubstr($string, 0, $length/2) . $etc . smartSubstr($string, -$length/2); } } else { return $string; } } ?>
위 코드는 완전히 구현되었습니다. 원래의 truncate 기능을 가지며 GB2312 및 UTF-8 인코딩과 모두 호환됩니다. 문자 길이를 판단할 때 한자는 1.0, 영어는 0.5로 계산되므로 플러그인 사용에는 특별한 상황이 없습니다.
다음은 간단한 테스트입니다.
코드는 다음과 같습니다.
{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")