2016-11-17 69 views
2

我试图找出在Perl v5.8.5中使用substr时出现问题。下面是一个例子的字符串:在Perl中的substr,削减utf8字符的一半

טובבגן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之前。我们需要用阿拉伯字符做一些特别的事吗?

更新:如果我检查字符串的前的长度后,一些时髦似乎是想在:

TEST:UTF-8的例子עץטובבגןいろはにほξεσκεπάζω
长度:63 长度:67之后

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

use utf8; 

谢谢!

+0

可以试试这个'使用open':encoding(utf8)'; binmode STDOUT,':utf8';' – ssr1012

+0

@ ssr1012 - 谢谢,但这似乎使情况变得更糟(破坏了编码:'UTF-8示例××××××××××ãããã«ÎÎÎμÏκÎμÏ' ) –

+1

你的字符串从哪里来?如果正在从文件读取数据,则在读取文件时,您需要将数据解码为Perl字符。如果它是你的源代码的一部分,你需要在程序中添加'use utf8',这样Perl就知道它是UTF-8。在这两种情况下,您都希望在打印字符之前将字符编码为UTF-8,并告诉输出文件句柄预期UTF-8数据。有关详细信息,请参阅(perlunitut)[http://perldoc.perl.org/perlunitut.html]。 –

回答

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年!)的软件,而所有者(慈善机构)不想升级到更好的论坛软件。我一直试图说服他一段时间,但它是一个不行。这会让我无法继续为他更新它,因为即使是开箱即用,代码也是如此混乱。无论如何,这似乎是现在赢得的一场战斗:)

+2

我怀疑这只是我们在你的问题的评论中提出的建议。 –

+0

@DaveCross - 是的可能。看到我为他免费做这件事,我真的不想花几个小时来调试它。我已经花了几个小时了,还有其他地方可以“修复”它。我已经解释过,他确实需要看看比2000年更新的东西,以使其更新(他认为旧版软件更安全,但我不同意!) –

+0

这不是一种解决方法。这就是你如何做到的。 Perl有两种​​类型的字符串:ASCII和UTF-8。在OP的代码中,字符串在ASCII字符串中具有UTF-8字符。正确的解决方案是将其转换为UTF-8字符串。这就是你如何做到的。 – shawnhcorey