作者liyih ()
看板Perl
标题Re: [问题] 固定长度的中英文句字处理?
时间Wed Jun 30 21:49:51 2010
※ 引述《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)
1F:推 tumc:谢啦!! 07/01 20:30