如何在终端中判断亚洲/日文字符的显示宽度?
问题背景
在终端中,以下三行内容显示宽度完全一致:
ヌー平行 parallel æøåüäöûß
(配有截图说明:「ヌー平行」与「parallel」显示宽度相同,单个字符「ヌ」和「p」的显示宽度也一致)
用Perl获取后两行的字符长度时,结果都是8,但第一行的字符长度被报告为4。请问有没有办法判断「ヌ」的显示宽度是「ø」的两倍?
解决方法
可以借助Unicode字符的East Asian Width属性来判断终端中的显示宽度,终端通常会依据这个属性来渲染字符宽度:
- 先安装Perl的
Unicode::EastAsianWidth模块,执行命令:cpan Unicode::EastAsianWidth - 然后用以下代码获取字符的宽度分类:
运行后会输出:use Unicode::EastAsianWidth; my @chars = ('ヌ', 'ø'); foreach my $char (@chars) { my $width = Unicode::EastAsianWidth::width($char); print "$char 的宽度分类: $width\n"; }ヌ 的宽度分类: W ø 的宽度分类: NaW代表Wide(宽字符),终端中占2个字符宽度;Na代表Narrow(窄字符),终端中占1个字符宽度。
另外,也可以直接通过Perl核心模块Unicode::UCD查询字符的East Asian Width属性:
use Unicode::UCD qw(charinfo); my $info_nu = charinfo(ord('ヌ')); my $info_o = charinfo(ord('ø')); print "ヌ 的East Asian Width: " . $info_nu->{east_asian_width} . "\n"; print "ø 的East Asian Width: " . $info_o->{east_asian_width} . "\n";
输出结果会显示「ヌ」的属性是W,「ø」是N,同样能验证两者的宽度差异。
终端渲染时,宽字符(如日文汉字、假名)默认占2列,窄字符(如英文、西欧特殊字符)占1列,这也解释了为什么第一行4个宽字符和后两行8个窄字符显示宽度一致。
内容的提问来源于stack exchange,提问作者Ole Tange
相关产品推荐
相关产品推荐

