2

$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;
}
4

1 に答える 1

1

このような小さなテキストについては、他にできることはあまりないと思います。しかし、より長いテキストの場合は、 East Asian Widthを調べて、それをテキスト内の文字の幅の参照として使用することをお勧めします (1 つずつではなく、コードポイントのブロックに圧縮されている可能性があります)。文字列を受け取り、その幅を返す関数を作成できます (標準 = 1、W = 2、H = 0.5 などを想定)。または、設定された長さ内のテキストを返します。

于 2012-07-20T13:40:01.443 に答える