>  기사  >  백엔드 개발  >  중국어, 영어 멀티코드 문자의 왜곡된 문자를 가로채는 문제를 스마트하게 해결

중국어, 영어 멀티코드 문자의 왜곡된 문자를 가로채는 문제를 스마트하게 해결

PHP中文网
PHP中文网원래의
2016-07-25 08:59:33807검색

이 글은 주로 스마트하게 중국어와 영어 다중 코드 문자를 가로채는 문제에 대한 해결책을 소개합니다. 여기에는 원래의 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 = &#39;&#39;&#39;&#39;;
    $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 = &#39;&#39;...&#39;&#39;, 
                                       $break_words = false, $middle = false) 
{ 
    if ($length == 0) 
        return &#39;&#39;&#39;&#39;;
    if (smartStrlen($string) > $length) { 
        $length -= smartStrlen($etc); 
        if (!$break_words && !$middle) { 
            $string = preg_replace(&#39;&#39;/\s+?(\S+)?$/&#39;&#39;, &#39;&#39;&#39;&#39;, 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로 계산되므로 플러그인 사용에는 특별한 상황이 없습니다.
다음은 간단한 테스트입니다.
코드는 다음과 같습니다.

표시: A in B Hua C.. (중국어 기호 길이는 1.0, 영어 기호 길이는 0.5, 길이는 생략된 기호 고려)
{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")
GB2312 인코딩을 사용하든 UTF-8 인코딩을 사용하든 결과가 올바른 것을 알 수 있는데, 이것이 제가 플러그인 이름에 smart라는 단어를 추가하는 이유 중 하나입니다.

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