2016-11-17 81 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