我从数据库中获取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,现在一切正常......
答案 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 时 - 字符串本身可能具有可变长度,具体取决于每个字符中的字节数。这也可能是危险的,因为你可以将一个字符切成两半(分割多个字节)。