在Perl中使用Substr,将utf8个字符缩减一半

时间:2016-11-17 07:45:07

标签: perl substr

我在Perl v5.8.5中使用substr时试图找出问题。这是一个示例字符串:

  

טובבגןUTF-8示例וובבはははにほξεσκεπάζωff

if (length($hit->{post_title}) > 60) {
  $hit->{post_title} = substr($hit->{post_title},0,60);
  $hit->{post_title} .= "...";
}

似乎被修剪为:

  

UTF-8示例וובבκκ<<<

在代码中,我看到一条关于宽字符的消息。我想知道是否substr可能会以某种方式将这个词减半?如果我删除代码的substr()部分,那么字符串显示正常。

我以前从未遇到过utf8。我们需要用阿拉伯字符做一些特别的事吗?

更新:如果我检查字符串之前和之后的长度,似乎会发生一些时髦的事情:

  

测试:UTF-8示例עץטובבגןशろはにほξεσκεπάζω
  长度:63   长度:67后

我只是不确定是什么! FWIW,我也在剧本的标题中使用它:

use utf8;

谢谢!

1 个答案:

答案 0 :(得分:2)

通常情况下,我现在找到了解决办法。它不是非常漂亮,但它似乎工作

use Unicode::String qw(utf8);

$us = utf8($hit->{post_title});
if ($us->length > 30) {
    $hit->{post_title} = $us->substr(0,30);
}

所以基本上将utf8字符串粘贴到Unicode :: String中,然后如果它超过给定的大小,则将其修剪并传回$hit->{post_title}。它并不漂亮,但能胜任。

不幸的是,这是一个古老的(2000年代)软件,而且所有者(慈善机构)并不想升级到更好的论坛软件。我一直试图说服他一段时间,但这是一个禁忌。它将达到一个我无法保持&#34;更新&#34;对他来说,因为代码是开箱即用的混乱。无论如何,这似乎是现在赢得的一场战斗:)