Maison développement back-end tutoriel php 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; 
    } 
} 
?>
Copier après la connexion


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

代码如下:

{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")
Copier après la connexion


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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment taper des flèches dans Word Comment taper des flèches dans Word Apr 16, 2023 pm 11:37 PM

Comment utiliser la correction automatique pour saisir des flèches dans Word L'un des moyens les plus rapides de saisir des flèches dans Word consiste à utiliser les raccourcis de correction automatique prédéfinis. Si vous tapez une séquence spécifique de caractères, Word convertit automatiquement ces caractères en symboles fléchés. Vous pouvez dessiner de nombreux styles de flèches différents en utilisant cette méthode. Pour taper une flèche dans Word à l'aide de la correction automatique : Déplacez votre curseur vers l'emplacement du document où vous souhaitez que la flèche apparaisse. Tapez l'une des combinaisons de caractères suivantes : Si vous ne souhaitez pas que ce que vous tapez soit remplacé par un symbole de flèche, appuyez sur la touche Retour arrière de votre clavier pour

Utilisez la fonction Character.isDigit() de Java pour déterminer si un caractère est un nombre Utilisez la fonction Character.isDigit() de Java pour déterminer si un caractère est un nombre Jul 27, 2023 am 09:32 AM

Utilisez la fonction Character.isDigit() de Java pour déterminer si un caractère est un caractère numérique. Les caractères sont représentés sous la forme de codes ASCII en interne dans l'ordinateur. Chaque caractère a un code ASCII correspondant. Parmi eux, les valeurs du code ASCII correspondant aux caractères numériques 0 à 9 sont respectivement 48 à 57. Pour déterminer si un caractère est un nombre, vous pouvez utiliser la méthode isDigit() fournie par la classe Character en Java. La méthode isDigit() est de la classe Character

Comment appliquer les options de formatage en exposant et en indice dans Microsoft Excel Comment appliquer les options de formatage en exposant et en indice dans Microsoft Excel Apr 14, 2023 pm 12:07 PM

Un exposant est un ou plusieurs caractères, lettres ou chiffres, que vous devez définir légèrement au-dessus de la ligne normale de texte. Par exemple, si vous devez écrire 1er, la lettre st doit être légèrement plus haute que le caractère 1. De même, un indice est un groupe de caractères ou un caractère unique et doit être défini légèrement à un niveau inférieur au niveau de texte normal. Par exemple, lorsque vous écrivez une formule chimique, vous devez placer les nombres sous la ligne normale de caractères. Les captures d'écran suivantes montrent quelques exemples de formatage en exposant et en indice. Même si cela peut sembler une tâche ardue, appliquer le formatage en exposant et en indice à votre texte est en réalité assez simple. Dans cet article, nous expliquerons en quelques étapes simples comment formater facilement du texte en exposant ou en indice. J'espère que vous avez apprécié la lecture de cet article. Comment appliquer l'exposant dans Excel

Comment saisir des caractères étendus, tels que le symbole du degré, sur iPhone et Mac ? Comment saisir des caractères étendus, tels que le symbole du degré, sur iPhone et Mac ? Apr 22, 2023 pm 02:01 PM

Votre clavier physique ou numérique offre un nombre limité d'options de caractères en surface. Cependant, il existe plusieurs façons d'accéder aux lettres accentuées, aux caractères spéciaux et bien plus encore sur iPhone, iPad et Mac. Le clavier iOS standard vous donne un accès rapide aux lettres majuscules et minuscules, aux chiffres standard, à la ponctuation et aux caractères. Bien sûr, il existe de nombreux autres personnages. Vous pouvez choisir entre des lettres avec des signes diacritiques et des points d'interrogation à l'envers. Vous êtes peut-être tombé sur un caractère spécial caché. Sinon, voici comment y accéder sur iPhone, iPad et Mac. Comment accéder aux caractères étendus sur iPhone et iPad Obtenir des caractères étendus sur votre iPhone ou iPad est très simple. Dans "Informations", "

Manière correcte d'afficher les caractères chinois dans matplotlib Manière correcte d'afficher les caractères chinois dans matplotlib Jan 13, 2024 am 11:03 AM

Afficher correctement les caractères chinois dans matplotlib est un problème souvent rencontré par de nombreux utilisateurs chinois. Par défaut, matplotlib utilise des polices anglaises et ne peut pas afficher correctement les caractères chinois. Pour résoudre ce problème, nous devons définir la police chinoise correcte et l'appliquer à matplotlib. Vous trouverez ci-dessous quelques exemples de code spécifiques pour vous aider à afficher correctement les caractères chinois dans matplotlib. Tout d’abord, nous devons importer les bibliothèques requises : importmatplot

Comment utiliser Golang pour déterminer si un caractère est une lettre Comment utiliser Golang pour déterminer si un caractère est une lettre Dec 23, 2023 am 11:57 AM

Comment utiliser Golang pour déterminer si un caractère est une lettre. Dans Golang, déterminer si un caractère est une lettre peut être obtenu en utilisant la fonction IsLetter du package Unicode. La fonction IsLetter vérifie si le caractère donné est une lettre. Ensuite, nous présenterons en détail comment utiliser Golang pour écrire du code afin de déterminer si un caractère est une lettre. Tout d’abord, vous devez créer un nouveau fichier Go dans lequel écrire le code. Vous pouvez nommer le fichier « main.go ». code

Concernant la représentation des caractères de la touche Entrée en Java, de laquelle s'agit-il ? Concernant la représentation des caractères de la touche Entrée en Java, de laquelle s'agit-il ? Mar 29, 2024 am 11:48 AM

La représentation alphabétique de la touche Entrée en Java est `. En Java, ` représente un caractère de nouvelle ligne, et lorsque ce caractère est rencontré, la sortie du texte sera renvoyée à la ligne. Voici un exemple de code simple qui montre comment utiliser `` pour représenter la touche Entrée : publicclassMain{publicstaticvoidmain(String[]args){System.out.println("Ceci est la première ligne de ce

Explication détaillée de la méthode d'interception de chaîne en langage Go Explication détaillée de la méthode d'interception de chaîne en langage Go Mar 13, 2024 am 08:03 AM

Explication détaillée des méthodes d'interception de chaînes dans le langage Go. Dans le langage Go, les chaînes sont des séquences d'octets immuables, certaines méthodes doivent donc être utilisées pour implémenter l'interception de chaînes. L'interception de chaîne est une opération courante pour obtenir une partie spécifique d'une chaîne. Vous pouvez intercepter les premiers caractères, les derniers caractères de la chaîne ou une certaine longueur de caractères à partir d'une position spécifique en fonction de vos besoins. Cet article présentera en détail comment intercepter des chaînes en langage Go et fournira des exemples de code spécifiques. Utiliser le découpage pour implémenter l'interception de chaînes Dans le langage Go, vous pouvez utiliser le découpage pour

See all articles