为什么这两种确定打印列数的方法表现不同?

时间:2013-05-03 12:59:51

标签: perl unicode printing

使用这些Unicode范围Unicode::GCStringcolumns会返回打印列的数量,而Text::CharWidthmbswidth则不会。 他们使用不同的数据库会有不同的行为吗?

#!/usr/bin/env perl
use warnings;
use strict;
use open qw(:std :utf8);
use Text::CharWidth qw(mbswidth);  # 0.04
use Unicode::GCString;             # 2012.10 

for my $hex ( 0x0378 .. 0xd7ff, 0xfa2e .. 0xfdcf, 0xfdfe .. 0xfff8 ) {
    my $chr = chr $hex;
    if ( mbswidth( $chr ) == -1 ) { # -1 invalid data
        my $gcs = Unicode::GCString->new( $chr );
        my $width = $gcs->columns;
        printf "%04x - %d  :  %s\n", $hex, $width, $chr;
    }
}

1 个答案:

答案 0 :(得分:1)

Text::CharWidth使用C库函数wcwidth,它取决于操作系统和当前语言环境。 Unicode::GCString使用sombok库。后者似乎定期更新到最新的Unicode版本,所以我认为它是准确的。