perl - Perl 中的 Substr,将 utf8 字符切成两半

标签 perl substr

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

טוב בגןUTF-8 Examples עץ טוב בגן いろはにほξεσκεπάζω ff

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

似乎被修剪成:

UTF-8 Examples עץ טוב בגן いろはにほξεσκε�...

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

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

更新:如果我检查前后字符串的长度,似乎确实发生了一些奇怪的事情:

TEST: UTF-8 Examples עץ טוב בגן いろはにほξεσκεπάζω
LENGTH: 63 LENGTH: 67 AFTER

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

use utf8;

谢谢!

最佳答案

通常,我现在找到了解决方法。它不是很漂亮,但它似乎有效

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 年代!)软件,所有者(慈善机构)不想升级到更好的论坛软件。我一直试图说服他一段时间,但这是不行的。它将达到我无法继续为他“更新”它的地步,因为即使开箱即用,代码也是如此困惑。无论如何,这似乎是一场胜利的战斗:)

关于perl - Perl 中的 Substr,将 utf8 字符切成两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40649259/

相关文章:

PHP substr 但保留 HTML 标签?

PHP 限制文本字符串不包括 html 标签?

带有 utf-8 的 php substr() 函数在末尾留下 � 标记

perl - 使用触发器运算符跟踪基于缩进的状态

perl - "use diagnostics;"有问题吗?

mysql 列子字符串 ()

r - 将角色分成几部分

perl - $fetched 是 Perl 中的一些隐式变量吗

perl - 获取经度/纬度并在 Perl 中获取 UTC 偏移量

arrays - 将数组传递给单独打印每个数组的子程序