在PHP中剪切UTF8文本

时间:2010-07-20 21:31:58

标签: php unicode utf-8 substring truncate

我从数据库中获取UTF8文本,我想只显示前面的$ len个字符(单词结尾)。我已经尝试了几个选项,但由于特殊字符(á,é,í,ó等),该功能仍无效。

感谢您的帮助!

function text_limit($text, $len, $end='...')
{ 

  mb_internal_encoding('UTF-8');
  if( (mb_strlen($text, 'UTF-8') > $len) ) { 

    $text = mb_substr($text, 0, $len, 'UTF-8');
    $text = mb_substr($text, 0, mb_strrpos($text," ", 'UTF-8'), 'UTF-8');

    ...
  }
}

修改以添加示例

如果我截断65个字符的文本,则返回:

  

Unjardíndeestiloneoclásicoacordecon el ...

如果我更改特殊字符(í,á),则返回:

  

Un jardin de estilo neoclasico acorde con el Palacio de ...

我确信编码或服务器或php有些奇怪;但我无法理解!谢谢!

最终解决方案

我正在使用此UTF8 PHP library,现在一切正常......

5 个答案:

答案 0 :(得分:7)

使用mb_substr。首先arg要检查的字符串是第二个是起始位置,第三个是长度,最后一个是编码。

mb_substr ("String", 0, $len, 'utf-8');

答案 1 :(得分:3)

mb_strrpos($text," ", 'UTF-8')

你没有向mb_strrpos()传递足够的args(你已经省略了偏移量 - 第3个参数,编码是第4个参数),请尝试:

mb_strrpos($text," ", 0, 'UTF-8')

虽然第二行省略了它,但它看起来还不错,就像你说的那样......“我想只显示前面的$ len个字符(用一个单词写完)” - 第二行确保它完成了< em>整个字?

编辑: mb_substr()应该切换$len个字符,而不是字节。你确定原始文本实际上是UTF-8而不是其他编码吗?

答案 2 :(得分:1)

好的,所以这令我感到困惑,你不能让它工作,因为它应该工作得很好。最后,我想我已经提出了这个不适合你的原因。

我的想法是,您的浏览器显示错误的编码,并且您输出的是utf-8字符。

你有几个选择。首先,如果您在html页面中显示任何内容,请检查您的元标记以查看它们是否设置了字符编码。如果是,请将其更改为:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

接下来如果您只是直接将其输出到浏览器,请使用header函数来设置字符编码,如下所示:

header("Content-type: text/html; charset=utf-8");

一个简单的测试:

<?php
    header("Content-type: text/html; charset=utf-8");
    $text = "áéíó";
    echo mb_substr($text, 0, 3, 'utf-8');
?>

如果没有这个,您的浏览器将默认为另一种编码并且不正确地显示文本。希望这可以帮助您解决这个问题,如果不是我会继续尝试:)

答案 3 :(得分:0)

尝试mb_strcut()怎么样?与mb_substr()相同的参数。

答案 4 :(得分:0)

这可能是因为您的原始解决方案将字符串截断为65字节,这通常在仅ASCII上下文中等于65个字符,但在使用UTF-8的多字节范围时变得不正确。将字符串截断为65 bytes 时 - 字符串本身可能具有可变长度,具体取决于每个字符中的字节数。这也可能是危险的,因为你可以将一个字符切成两半(分割多个字节)。