Perl Unicode 美食大全:图形字符长度

℞ 33: 图形字符长度

如果你对 Unicode 没有学到其他东西,请记住这一点:字符不是字节,不是图形字符,不是码点。一个用户可见的符号(一个 图形字符)可能由多个 码点 组成。多个码点的组合可能产生相同的用户可见图形字符。

为了在心中清晰地区分所有这些实体,请小心并具体地考虑你在哪个层面上想要做什么。

作为一个具体的例子,字符串 brûlée 有六个图形字符,但最多有八个码点。现在假设你想获取它的长度。长度意味着什么?如果你的字符串被归一化为每个码点一个图形字符的形式,length() 是一样的,但是考虑

 use Unicode::Normalize;
 my $str = "brûlée";
 say length $str;
 say length NFD( $str );

通过图形字符计数来测量字符串的长度,而不是码点

 my $str   = "brûlée";
 my $count = 0;
 while ($str =~ /\X/g) { $count++ }

或者(在 Perl 的旧版本中),CPAN 模块 Unicode::GCString 很有用

 use Unicode::GCString;
 my $gcs   = Unicode::GCString->new($str);
 my $count = $gcs->length;

上一节: ℞ 32: 通过图形字符反转字符串

系列索引: 标准序言

下一节: ℞ 34: 打印时的 Unicode 列宽度

标签

反馈

这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求以帮助我们。