Heim Backend-Entwicklung PHP-Tutorial smarty中英文多编码字符截取乱码问题解决方法

smarty中英文多编码字符截取乱码问题解决方法

May 31, 2016 pm 07:28 PM
smarty 字符 截取

本文实例讲述了smarty中英文多编码字符截取乱码问题解决方法,分享给大家供大家参考。具体方法如下:

一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用 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; 
    } 
} 
?>
Nach dem Login kopieren


以上代码完整实现了truncate的原有功能,而且可以同时兼容GB2312和UTF-8编码,在判断字符长度的时候,一个中文字符算1.0,一个英文字符算0.5,所以在截取子字符串的时候不会出现参差不齐的情况.
插件的使用方式没有特别之处,这里简单测试一下:

代码如下:

{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")
Nach dem Login kopieren


显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)
不管你是使用GB2312编码还是UTF-8编码,你会发现结果都正确,这也是为什么我在插件名字里加上smart字样的原因之一。

希望本文所述对大家的PHP程序设计有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So geben Sie Pfeile in Word ein So geben Sie Pfeile in Word ein Apr 16, 2023 pm 11:37 PM

So verwenden Sie AutoKorrektur zum Eingeben von Pfeilen in Word Eine der schnellsten Möglichkeiten, Pfeile in Word einzugeben, ist die Verwendung der vordefinierten AutoKorrektur-Verknüpfungen. Wenn Sie eine bestimmte Zeichenfolge eingeben, wandelt Word diese Zeichen automatisch in Pfeilsymbole um. Mit dieser Methode können Sie viele verschiedene Pfeilstile zeichnen. So geben Sie mit der AutoKorrektur einen Pfeil in Word ein: Bewegen Sie den Cursor an die Stelle im Dokument, an der der Pfeil erscheinen soll. Geben Sie eine der folgenden Zeichenkombinationen ein: Wenn Sie nicht möchten, dass Ihre Eingabe in ein Pfeilsymbol umgewandelt wird, drücken Sie dazu die Rücktaste auf Ihrer Tastatur

So wenden Sie Formatierungsoptionen für hochgestellte und tiefgestellte Zeichen in Microsoft Excel an So wenden Sie Formatierungsoptionen für hochgestellte und tiefgestellte Zeichen in Microsoft Excel an Apr 14, 2023 pm 12:07 PM

Bei einem hochgestellten Zeichen handelt es sich um ein oder mehrere Zeichen, entweder Buchstaben oder Zahlen, die Sie etwas über der normalen Textzeile platzieren müssen. Wenn Sie beispielsweise „1st“ schreiben müssen, muss der Buchstabe „st“ etwas höher sein als der Buchstabe „1“. Ebenso ist ein Index eine Gruppe von Zeichen oder ein einzelnes Zeichen und muss etwas niedriger als die normale Textebene eingestellt werden. Wenn Sie beispielsweise eine chemische Formel schreiben, müssen Sie die Zahlen unterhalb der normalen Zeichenzeile platzieren. Die folgenden Screenshots zeigen einige Beispiele für die hochgestellte und tiefgestellte Formatierung. Obwohl es wie eine entmutigende Aufgabe erscheinen mag, ist die Anwendung der hoch- und tiefgestellten Formatierung auf Ihren Text eigentlich ganz einfach. In diesem Artikel erklären wir in einigen einfachen Schritten, wie Sie Text ganz einfach mit Hoch- oder Tiefstellung formatieren können. Ich hoffe, Ihnen hat die Lektüre dieses Artikels gefallen. So wenden Sie hochgestellte Zeichen in Excel an

Wie gibt man auf dem iPhone und Mac erweiterte Zeichen wie das Gradzeichen ein? Wie gibt man auf dem iPhone und Mac erweiterte Zeichen wie das Gradzeichen ein? Apr 22, 2023 pm 02:01 PM

Ihre physische oder numerische Tastatur bietet eine begrenzte Anzahl von Zeichenoptionen auf der Oberfläche. Es gibt jedoch mehrere Möglichkeiten, auf dem iPhone, iPad und Mac auf Buchstaben mit Akzent, Sonderzeichen und mehr zuzugreifen. Mit der Standard-iOS-Tastatur haben Sie schnellen Zugriff auf Groß- und Kleinbuchstaben, Standardzahlen, Satzzeichen und Zeichen. Natürlich gibt es noch viele andere Charaktere. Sie können zwischen Buchstaben mit diakritischen Zeichen und auf dem Kopf stehenden Fragezeichen wählen. Möglicherweise sind Sie auf ein verstecktes Sonderzeichen gestoßen. Wenn nicht, erfahren Sie hier, wie Sie auf iPhone, iPad und Mac darauf zugreifen können. So greifen Sie auf erweiterte Zeichen auf dem iPhone und iPad zu. Es ist sehr einfach, erweiterte Zeichen auf Ihrem iPhone oder iPad zu erhalten. Unter „Informationen“:

Verwenden Sie die Java-Funktion Character.isDigit(), um festzustellen, ob ein Zeichen eine Zahl ist Verwenden Sie die Java-Funktion Character.isDigit(), um festzustellen, ob ein Zeichen eine Zahl ist Jul 27, 2023 am 09:32 AM

Verwenden Sie die Funktion Character.isDigit() von Java, um festzustellen, ob es sich bei einem Zeichen um ein numerisches Zeichen handelt. Zeichen werden intern im Computer in Form von ASCII-Codes dargestellt. Unter diesen sind die ASCII-Codewerte, die den numerischen Zeichen 0 bis 9 entsprechen, 48 bis 57. Um festzustellen, ob ein Zeichen eine Zahl ist, können Sie die von der Character-Klasse in Java bereitgestellte Methode isDigit() verwenden. Die Methode isDigit() gehört zur Klasse Character

Richtige Art und Weise, chinesische Schriftzeichen in Matplotlib anzuzeigen Richtige Art und Weise, chinesische Schriftzeichen in Matplotlib anzuzeigen Jan 13, 2024 am 11:03 AM

Die korrekte Anzeige chinesischer Zeichen in Matplotlib ist ein Problem, auf das viele chinesische Benutzer häufig stoßen. Standardmäßig verwendet matplotlib englische Schriftarten und kann chinesische Zeichen nicht korrekt anzeigen. Um dieses Problem zu lösen, müssen wir die richtige chinesische Schriftart festlegen und diese auf matplotlib anwenden. Nachfolgend finden Sie einige spezifische Codebeispiele, die Ihnen dabei helfen, chinesische Schriftzeichen in matplotlib korrekt anzuzeigen. Zuerst müssen wir die erforderlichen Bibliotheken importieren: importmatplot

So ermitteln Sie mithilfe von Golang, ob ein Zeichen ein Buchstabe ist So ermitteln Sie mithilfe von Golang, ob ein Zeichen ein Buchstabe ist Dec 23, 2023 am 11:57 AM

So verwenden Sie Golang, um festzustellen, ob ein Zeichen ein Buchstabe ist. In Golang kann mithilfe der IsLetter-Funktion im Unicode-Paket ermittelt werden, ob ein Zeichen ein Buchstabe ist. Die Funktion IsLetter prüft, ob das angegebene Zeichen ein Buchstabe ist. Als Nächstes stellen wir detailliert vor, wie Sie mit Golang Code schreiben, um festzustellen, ob es sich bei einem Zeichen um einen Buchstaben handelt. Zuerst müssen Sie eine neue Go-Datei erstellen, in die Sie den Code schreiben. Sie können die Datei „main.go“ nennen. Code

Was ist die Zeichendarstellung der Eingabetaste in Java? Was ist die Zeichendarstellung der Eingabetaste in Java? Mar 29, 2024 am 11:48 AM

Die Zeichendarstellung der Eingabetaste in Java ist „. In Java stellt ` ein Zeilenumbruchzeichen dar, und wenn dieses Zeichen angetroffen wird, wird die Textausgabe umbrochen. Hier ist ein einfaches Codebeispiel, das zeigt, wie „“ zur Darstellung der Eingabetaste verwendet wird: publicclassMain{publicstaticvoidmain(String[]args){System.out.println(“Dies ist die erste Zeile davon

Detaillierte Erläuterung der String-Abfangmethode in der Go-Sprache Detaillierte Erläuterung der String-Abfangmethode in der Go-Sprache Mar 13, 2024 am 08:03 AM

Detaillierte Erläuterung der String-Abfangmethoden in der Go-Sprache. In der Go-Sprache sind Strings unveränderliche Bytesequenzen, daher müssen einige Methoden verwendet werden, um das String-Abfangen zu implementieren. Das Abfangen von Zeichenfolgen ist eine übliche Operation zum Abrufen eines bestimmten Teils einer Zeichenfolge. Sie können je nach Bedarf die ersten paar Zeichen, die letzten paar Zeichen der Zeichenfolge oder eine bestimmte Länge von Zeichen abfangen. In diesem Artikel wird detailliert beschrieben, wie Zeichenfolgen in der Go-Sprache abgefangen werden, und es werden spezifische Codebeispiele bereitgestellt. Verwenden von Slicing zum Implementieren des Abfangens von Zeichenfolgen. In der Go-Sprache können Sie Slicing verwenden, um

See all articles