UTF-8 совместимая функция усечения - PullRequest
4 голосов
/ 09 июня 2011

Кто-нибудь сталкивался с этой проблемой для сложных латинских символов, таких как вьетнамский?

    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);

выводит:

Bà Rịa - V�…

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

Мне нужна помощь, чтобы расколоть персонажа, но я даже не уверен, что происходит за кулисами.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Вы можете использовать mb_strimwidth (Документация PHP):

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

Или пользовательскую функцию, например Обрезание многобайтовой строки для 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;
    }
}
0 голосов
/ 22 июля 2011

Обязательно выполните необходимую нормализацию Unicode, чтобы каждый символ соответствовал одной кодовой точке.

Часто задаваемые вопросы по вьетнамскому Unicode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...