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 = ''''; $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")
显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)
不管你是使用GB2312编码还是UTF-8编码,你会发现结果都正确,这也是为什么我在插件名字里加上smart字样的原因之一。
希望本文所述对大家的PHP程序设计有所帮助。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan AutoCorrect untuk menaip anak panah dalam Word Salah satu cara terpantas untuk menaip anak panah dalam Word ialah menggunakan pintasan AutoCorrect yang dipratentukan. Jika anda menaip jujukan aksara tertentu, Word secara automatik menukar aksara tersebut kepada simbol anak panah. Anda boleh melukis banyak gaya anak panah yang berbeza menggunakan kaedah ini. Untuk menaip anak panah dalam Word menggunakan AutoCorrect: Gerakkan kursor anda ke lokasi dalam dokumen yang anda mahu anak panah itu muncul. Taipkan salah satu daripada gabungan aksara berikut: Jika anda tidak mahu apa yang anda taip diperbetulkan kepada simbol anak panah, tekan kekunci ruang belakang pada papan kekunci anda untuk

Superskrip ialah aksara atau aksara, sama ada huruf atau nombor, yang anda perlu tetapkan sedikit di atas baris teks biasa. Sebagai contoh, jika anda perlu menulis 1, huruf st perlu lebih tinggi sedikit daripada aksara 1. Begitu juga, subskrip ialah sekumpulan aksara atau aksara tunggal dan perlu ditetapkan lebih rendah sedikit daripada tahap teks biasa. Sebagai contoh, apabila anda menulis formula kimia, anda perlu meletakkan nombor di bawah garis biasa aksara. Tangkapan skrin berikut menunjukkan beberapa contoh pemformatan superskrip dan subskrip. Walaupun ia mungkin kelihatan seperti tugas yang sukar, menggunakan pemformatan superskrip dan subskrip pada teks anda sebenarnya agak mudah. Dalam artikel ini, kami akan menerangkan dalam beberapa langkah mudah cara memformat teks dengan mudah menggunakan superskrip atau subskrip. Harap anda seronok membaca artikel ini. Cara menggunakan superskrip dalam Excel

Papan kekunci fizikal atau angka anda menyediakan bilangan pilihan aksara yang terhad di permukaan. Walau bagaimanapun, terdapat beberapa cara untuk mengakses huruf beraksen, aksara khas dan banyak lagi pada iPhone, iPad dan Mac. Papan kekunci iOS standard memberi anda akses pantas kepada huruf besar dan huruf kecil, nombor standard, tanda baca dan aksara. Sudah tentu, terdapat banyak watak lain. Anda boleh memilih daripada huruf dengan diakritik kepada tanda soal terbalik. Anda mungkin terjumpa watak istimewa yang tersembunyi. Jika tidak, berikut ialah cara untuk mengaksesnya pada iPhone, iPad dan Mac. Cara Mengakses Aksara Lanjutan pada iPhone dan iPad Mendapatkan aksara lanjutan pada iPhone atau iPad anda adalah sangat mudah. Dalam "Maklumat", "

Gunakan fungsi Java's Character.isDigit() untuk menentukan sama ada aksara ialah aksara angka diwakili dalam bentuk kod ASCII secara dalaman dalam komputer Setiap aksara mempunyai kod ASCII yang sepadan. Antaranya, nilai kod ASCII yang sepadan dengan aksara angka 0 hingga 9 masing-masing adalah 48 hingga 57. Untuk menentukan sama ada aksara ialah nombor, anda boleh menggunakan kaedah isDigit() yang disediakan oleh kelas Aksara dalam Java. Kaedah isDigit() adalah daripada kelas Aksara

Memaparkan aksara Cina dengan betul dalam matplotlib adalah masalah yang sering dihadapi oleh ramai pengguna Cina. Secara lalai, matplotlib menggunakan fon Inggeris dan tidak boleh memaparkan aksara Cina dengan betul. Untuk menyelesaikan masalah ini, kita perlu menetapkan fon Cina yang betul dan menggunakannya pada matplotlib. Di bawah ialah beberapa contoh kod khusus untuk membantu anda memaparkan aksara Cina dengan betul dalam matplotlib. Pertama, kita perlu mengimport perpustakaan yang diperlukan: importmatplot

Cara menggunakan Golang untuk menentukan sama ada aksara ialah huruf Dalam Golang, menentukan sama ada aksara ialah huruf boleh dicapai dengan menggunakan fungsi IsLetter dalam pakej Unicode. Fungsi IsLetter menyemak sama ada aksara yang diberikan ialah huruf. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan Golang untuk menulis kod untuk menentukan sama ada sesuatu aksara itu adalah huruf. Pertama, anda perlu mencipta fail Go baharu untuk menulis kod tersebut. Anda boleh menamakan fail "main.go". kod

Perwakilan aksara kekunci Enter dalam Java ialah `. Dalam Java, ` mewakili aksara baris baharu, dan apabila aksara ini ditemui, output teks akan dibalut. Berikut ialah contoh kod ringkas yang menunjukkan cara menggunakan `` untuk mewakili kekunci Enter: publicclassMain{publicstaticvoidmain(String[]args){System.out.println("Ini ialah baris pertama ini

Penjelasan terperinci tentang kaedah pemintasan rentetan dalam bahasa Go Dalam bahasa Go, rentetan ialah urutan bait yang tidak boleh diubah, jadi beberapa kaedah perlu digunakan untuk melaksanakan pemintasan rentetan. Pintasan rentetan ialah operasi biasa untuk mendapatkan bahagian tertentu rentetan Anda boleh memintas beberapa aksara pertama, beberapa aksara terakhir rentetan atau panjang aksara tertentu dari kedudukan tertentu mengikut keperluan anda. Artikel ini akan memperkenalkan secara terperinci cara memintas rentetan dalam bahasa Go dan memberikan contoh kod khusus. Menggunakan penghirisan untuk melaksanakan pemintasan rentetan Dalam bahasa Go, anda boleh menggunakan penghirisan ke
