Re: [問題] 固定長度的中英文句字處理?

看板Perl作者時間15年前 (2010/06/30 21:49), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《liyih ()》之銘言: : ※ 引述《tumc (HIHIHI)》之銘言: : : 如果是一個句子裡面混雜了big5及英文字, : : 如果要將句子控制在一個固定的長度,也就是多的部份要截掉 : : ,但希望截的"乾淨",也就是不希望發生中文字被截一半,造成奇怪的字出現 : : 請問該如何做呢? : : ex: : : 若是要固定輸出不能超過為5個中文字 : : $s="這句有5個半" => "這句有5個" : : $s="這句是六個整" => "這句是六個" : : $s="最後是數字5" => "最後是數字" : use Encode; : sub cutString { : my ( $str, $max_length, $enc ) = @_; : $max_length = defined($max_length) ? $max_length : 48; : $enc = defined($enc) ? $enc : 'big5'; : $str = decode( $enc, $str ); : $str = substr( $str, 0, $max_length ); : encode( $enc, $str ); : } : my $s = "這句有5個半"; : print cutString( $s, 5 ); => 如果 $s 是 big5 : print cutString( $s, 5, 'utf-8' ); => 如果 $s 是 utf-8 : 這樣我的輸入、輸出都是 bytes,而字串的操作都是用 characters 為單位。 : 建議您可以先釐清 characters 與 bytes 的差異,參考以下這個投影片 : http://www.slideshare.net/Penfold/perl-and-unicode 暫時沒有比較好的方法,試看看以下: * source code 使用 big5 編碼 * use Encode; # 要用單引號,避開 \ 符號 my $original = '123聽許功育說這是第5個中文字?'; my $total_bytes = length($original); for ( 0 .. $total_bytes ) { my $partial = substr( $original, 0, $_ ); # 透過 Encode 來修正最後被截掉的漢字 my $fixed = decode( 'big5', $partial ); $fixed = encode( 'big5', $fixed ); my $bug_str = sprintf( "%3d) =[%s]=", $_, $partial ); printf( "%-40s %3d) =[%s]=\n", $bug_str, $_, $fixed ); } 可以試著帶入 Encode::FB_DEFAULT、Encode::FB_CROAK、Encode::FB_QUIET 比較一下。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.23.179 ※ 編輯: liyih 來自: 140.114.64.133 (07/01 10:31)

07/01 20:30, , 1F
謝啦!!
07/01 20:30, 1F
文章代碼(AID): #1CAqk2uc (Perl)
文章代碼(AID): #1CAqk2uc (Perl)