简体   繁体   中英

Fit for print: How to cut strings with codepoints that take more than one print column?

Is there a shorter way to cut this Chinese text so that it fits in a $print_length width print column?

#!/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;
}

For small texts like this I don't think you can do much else. But for longer texts you might want to look into East Asian Width , and use that (maybe compressed into blocks of codepoints instead of one by one) as a reference for the width of the characters in your text. You could have a function that takes a string and returns its width (assuming standard = 1, W =2, H = 0.5 etc). Or that returns text within a set length.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM