Perl Unicode 烹饪书:打印的 Unicode 列宽

℞ 34:打印的 Unicode 列宽

Perl 的 printfsprintfformat 都认为所有码点占用 1 个打印列宽,但许多码点实际上占用 0 或 2 个。如果您使用这些内置函数来对齐文本,可能会发现 Perl 对码点宽度的理解与您的预期不符。

Unicode::GCString 模块的 columns() 方法考虑了每个码点的宽度,并返回字符串将占用的列数。使用此方法来确定 Unicode 字符串的显示宽度。

为了说明归一化不会影响字符串的列数,我们打印出两种形式的字符串

 # cpan -i Unicode::GCString
 use Unicode::GCString;
 use Unicode::Normalize;

 my @words = qw/crème brûlée/;
 @words    = map { NFC($_), NFD($_) } @words;

 for my $str (@words) {
     my $gcs  = Unicode::GCString->new($str);
     my $cols = $gcs->columns;
     my $pad  = " " x (10 - $cols);
     say str, $pad, " |";
 }

… 以显示无论归一化如何,它都能正确填充

 crème      |
 crème      |
 brûlée     |
 brûlée     |

上一页:℞ 33:字符图形中的字符串长度

系列索引:标准前言

下一页:℞ 35:Unicode 排序

标签

反馈

这篇文章有什么问题?请通过在 GitHub 上打开问题或拉取请求来帮助我们。