Re: [問題] 固定長度的中英文句字處理?
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章