【问题标题】:Cut an UTF8 text in PHP在 PHP 中剪切一个 UTF8 文本
【发布时间】:2011-03-18 16:42:27
【问题描述】:

我从数据库中获取 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 个字符的文本,它会返回:

Un jardín de estilo neoclásico acorde con el …

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

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

我确定编码或服务器或 php 有一些奇怪的地方;但我想不通!谢谢!

最终解决方案

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

【问题讨论】:

  • 如果你不使用 text_limit 那么编码不会有问题,对吧?
  • 文本显示没有任何问题。当我剪掉它时,问题就来了,那些特殊字符占据了几个字节,所以 text_limit() 返回一个非常短的字符串。
  • 'mb_substr()' 应该切割 $len 个字符,而不是字节。您确定原始文本实际上是 UTF-8 而不是其他编码?!
  • @gordon,谢谢!但它不起作用,因为它几乎是一样的。 @w3d,我正在使用 'mb_check_encoding($string, 'UTF-8');'检查字符串是否有 UTF( 编码。我的数据库是 UTF8 的,我的 symfony 系统有 UTF8 作为它的默认字符集。

标签: php unicode utf-8 substring truncate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好的,所以这让我很困惑,你无法让它工作,因为它应该工作得很好。最后我想我已经想出了这对你不起作用的原因。

    我认为这里发生的情况是您的浏览器以错误的编码显示并且您正在输出 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');
    ?>
    

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

    【讨论】:

    • OP说在使用函数text_limit之前输出没有问题。因此元标记是 IMO 设置为 UTF-8。顺便说一句:尝试使用编辑而不是添加新答案;-)
    • 非常感谢 kelly,但这不是问题,正如 MartyIX 所说。解决方法:使用下面的UTF8库,现在就可以了,别问我为什么tarski.googlecode.com/svn/branches/1.6/library/feedparser/…
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      mb_strrpos($text," ", 'UTF-8')
      

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

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

      虽然第二行省略了它,但看起来还可以,就像你说的那样......“我只想显示第一个 $len 字符(以一个单词结尾)” - 第二行确保它在 整个字?

      编辑: mb_substr() 应该以 $len 的字符数进行切割,而不是字节数。您确定原始文本实际上是 UTF-8 而不是其他编码吗?

      【讨论】:

      • 感谢您的更正,但它不起作用。第二行删除最后一个不完整的单词(它搜索空格,并将文本剪切到该位置)。
      • 我正在使用 'mb_check_encoding($string, 'UTF-8');'检查字符串是否具有 UTF8 编码。我的数据库是 UTF8,我的 symfony 系统有 UTF8 作为它的默认字符集。关于检查什么的任何想法?谢谢!
      【解决方案5】:

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

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

      【讨论】:

      • 如果 $len 为 3,则返回 Str
      • 糟糕,抱歉快速查看了一下,只看到了strlen。
      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多