php smarty截取中文字符乱码问题?gb2312/utf-8_php模板
一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,视觉上会显得参差不齐,影像美观。这是因为一个中文的长度大致相当与两个英文的长度。此外,truncate也不能同时兼容GB2312, UTF-8等编码。
改良的smartTruncate: 文件名:modifier.smartTruncate.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 {
$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 {
$start = max(smartStrlen($string) + $start, 0);
}
for($i = 0; $i {
if($start {
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 {
if($length {
break;
}
if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1)
{
if($length {
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")
显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)
不管你是使用GB2312编码还是UTF-8编码,你会发现结果都正确,这也是为什么我在插件名字里加上smart字样的原因之一。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











잘못된 단어 페이지 번호에 대한 해결 방법: 1. 단어 문서를 열고 왼쪽 상단에 있는 "파일" 옵션을 클릭합니다. 2. "추가" 옵션을 선택한 다음 "옵션" 버튼을 클릭합니다. 4. "문서 내용 표시"에서 "필드 값 대신 필드 코드 표시"를 찾아 앞에 있는 확인 표시를 제거한 후 확인을 클릭하여 홈 페이지로 돌아갑니다.

Linux 중국어 왜곡 문제는 중국어 문자 세트 및 인코딩을 사용할 때 흔히 발생하는 문제입니다. 잘못된 파일 인코딩 설정, 시스템 로케일이 설치 또는 설정되지 않음, 터미널 디스플레이 구성 오류 등으로 인해 문자가 깨질 수 있습니다. 이 문서에서는 몇 가지 일반적인 해결 방법을 소개하고 특정 코드 예제를 제공합니다. 1. 파일 인코딩 설정을 확인하십시오. 파일 인코딩을 보려면 터미널에서 file 명령을 사용하십시오. 출력에 "charset"이 있는 경우.

잘못된 Tomcat 시작에 대한 해결 방법: 1. Tomcat의 conf 구성 파일 수정 2. 명령줄 창 인코딩 수정 4. Tomcat 서버 구성 확인 6. 로그 확인 파일 7, 다른 해결 방법을 시도해 보세요. 자세한 소개: 1. Tomcat의 conf 구성 파일을 수정하고, Tomcat의 conf 디렉터리를 열고, "logging.properties" 파일을 찾습니다.

win11에서 텍스트 문서가 왜곡되는 문제를 해결하는 방법은 무엇입니까? 많은 사용자가 win11 시스템을 사용하면 텍스트 문서가 깨져서 정상적으로 읽을 수 없습니다. 많은 친구들이 이 문제를 해결하는 방법을 모릅니다. 사실 이 방법은 어렵지 않습니다. 아래에서 편집자는 Windows 11 시스템 문서가 왜곡된 문제를 해결하는 단계를 정리했습니다. 이것이 여러분에게 영감을 줄 수 있기를 바랍니다. 왜곡된 Windows 11 시스템 문서를 해결하는 단계: 1. 먼저 win11의 제어판을 열고 아래 검색 상자에 제어판을 입력한 후 검색을 클릭하여 제어판에 들어갑니다. 2. 패널 진입 후 시계와 지역을 찾아 클릭하여 진입한 후 지역 옵션을 클릭하세요. 3. 입력 후 관리 패널을 클릭한 후 시스템 지역 설정 변경을 클릭합니다.

Windows 10 시스템에서는 잘못된 문자가 일반적입니다. 그 이유는 종종 운영 체제가 일부 문자 집합에 대해 기본 지원을 제공하지 않거나 문자 집합 옵션 설정에 오류가 있기 때문입니다. 올바른 약을 처방하기 위해 실제 수술 과정을 아래에서 자세히 분석해 보겠습니다. Windows 10 잘못된 코드를 해결하는 방법 1. 설정을 열고 "시간 및 언어"를 찾습니다. 2. 그런 다음 "언어"를 찾습니다. 3. "언어 설정 관리"를 찾습니다. 4. 여기에서 "시스템 지역 설정 변경"을 클릭합니다. 5. 표시된 대로 확인하고 클릭합니다. 그냥 확인하세요.

많은 사용자가 컴퓨터를 사용할 때 접미사 dll이 포함된 파일이 많이 있지만 이러한 파일을 여는 방법을 모르는 사용자가 많다는 것을 알게 될 것입니다. 알고 싶은 사용자는 다음 세부 정보를 살펴보십시오. 튜토리얼~열기 방법 dll 파일 편집: 1. "exescope"라는 소프트웨어를 다운로드하여 설치합니다. 2. 그런 다음 dll 파일을 마우스 오른쪽 버튼으로 클릭하고 "exescope로 리소스 편집"을 선택합니다. 3. 그런 다음 팝업 오류 프롬프트 상자에서 "확인"을 클릭하십시오. 4. 그런 다음 오른쪽 패널에서 각 그룹 앞에 있는 "+" 기호를 클릭하면 해당 그룹에 포함된 콘텐츠를 볼 수 있습니다. 5. 보려는 dll 파일을 클릭한 다음 "파일"을 클릭하고 "내보내기"를 선택합니다. 6. 그러면 할 수 있다

일부 친구는 메모장을 열고 싶어하는데 win11 메모장이 깨져서 무엇을 해야 할지 모릅니다. 실제로 우리는 일반적으로 지역과 언어만 수정하면 됩니다. Win11 메모장이 깨졌습니다. 첫 번째 단계에서는 검색 기능을 사용하여 "제어판"을 검색하고 엽니다. 두 번째 단계에서는 시계 및 지역 아래에서 "날짜, 시간 또는 숫자 형식 변경"을 클릭합니다. 세 번째 단계에서는 카드 위의 "관리" 옵션을 클릭합니다. 네 번째 단계는 아래의 "시스템 지역 설정 변경"을 클릭하는 것입니다. 다섯 번째 단계는 현재 시스템 지역 설정을 "중국어(간체, 중국)"로 변경하고 "확인"을 클릭하여 저장하는 것입니다.

filezilla 왜곡된 문자에 대한 해결 방법은 다음과 같습니다. 1. 인코딩 설정을 확인합니다. 3. 서버 구성을 확인합니다. 5. 소프트웨어 버전을 업데이트합니다. .기술 지원을 요청하세요. FileZilla 문자 깨짐 문제를 해결하려면 여러 측면에서 시작하여 점차적으로 문제의 원인을 조사하고 해당 조치를 취하여 복구해야 합니다.
