Вычислить ширину строки в моноширинном шрифте - PullRequest
0 голосов
/ 04 ноября 2018

Чтобы правильно отформатировать некоторый текст в терминале (где я предполагаю использование моноширинного шрифта), мне нужно вычислить «длину» строк. Сложность в том, что мне нужна длина, которую он будет использовать для отображения (в количестве символов фиксированной ширины).

Первоначально я использовал функцию length , но она возвращает число кодовых точек . Я также пытался подсчитать количество графем , используя:

sub width {
    my $str = shift;
    my $count = 0;
    while ($str =~ /\X/g) {
        $count++;
    }
    return $count;
}

(Кредиты Том Кристиансен ).

Но это все еще не то, что мне нужно, так как некоторые графемы имеют двойную ширину с моим шрифтом (SF Mono Regular), например, смайлики и азиатские персонажи.

1 Ответ

0 голосов
/ 04 ноября 2018

После дальнейших исследований я обнаружил модуль Text :: CharWidth CPAN, который обеспечивает функцию mbswidth, делая именно то, что мне нужно.

use Text::CharWidth qw(mbswidth);

mbswidth ("??"); # returns 4
mbswidth ("あら"); # returns 4
...