适合打印:如何使用带有多个打印列的代码点剪切字符串?

时间:2012-07-19 08:35:50

标签: perl unicode pretty-print substr

是否有更短的方法来剪切此中文文本以使其适合$print_length宽度的打印列?

#!/usr/bin/env perl
use warnings;
use 5.10.1;
use utf8;
binmode STDOUT, ':utf8';
use Unicode::GCString;

my $print_length = 15;

my $string1 = 'abcdefghijklmnopqrstuvwxyz';
say substr( $string1, 0, $print_length );

my $string2 = '大佛頂如來密因修證了義諸菩薩萬行首楞嚴經'; # don't know what that means
say fit_for_column( $string2 );

sub fit_for_column {
    my ( $string ) = @_;

    my $gcs = Unicode::GCString->new( $string ); 
    my $pcw = $gcs->columns();

    while ( $pcw > $print_length ) {
        $string =~ s/\X\z//;
        $gcs = Unicode::GCString->new( $string );
        $pcw = $gcs->columns();
    }
    return $string;
}

1 个答案:

答案 0 :(得分:1)

对于像这样的小文本,我认为你不能做太多其他事情。但是对于较长的文本,您可能需要查看East Asian Width,并使用它(可能压缩成代码点块而不是逐个)作为文本中字符宽度的参考。你可以有一个函数,它接受一个字符串并返回它的宽度(假设标准= 1,W = 2,H = 0.5等)。或者返回设定长度内的文本。