Função truncada compatível com UTF-8

Alguém encontrou esse problema para personagens latinos complexos, como vietnamitas?

function truncate($str, $length, $append = '…') { $strLength = mb_strlen($str); if ($strLength <= $length) { return $str; } return mb_substr($str, 0, $length) . $append; } echo truncate('Bà Rịa - Vũng Tàu!', 14); 

saídas:

Bà Rịa – V …

http://codepad.viper-7.com/GOZFB0

Preciso de ajuda para cortar o personagem, mas nem tenho certeza do que está acontecendo nos bastidores aqui.

Você pode usar mb_strimwidth (Documentação PHP):

 echo mb_strimwidth("Hello World", 0, 10, "..."); 

Ou uma function personalizada como Multibyte String Truncate for Smarty :

 mb_truncate($string, $length = 80, $etc = '...', $charset='UTF-8', $break_words = false, $middle = false) { if ($length == 0) return ''; if (strlen($string) > $length) { $length -= min($length, strlen($etc)); if (!$break_words && !$middle) { $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1, $charset)); } if(!$middle) { return mb_substr($string, 0, $length, $charset) . $etc; } else { return mb_substr($string, 0, $length/2, $charset) . $etc . mb_substr($string, -$length/2, $charset); } } else { return $string; } } 

Certifique-se de executar a normalização Unicode necessária para garantir que cada caractere corresponda a um único código.

Perguntas frequentes do Unicode vietnamitas