Есть ли уже модуль, который предоставляет метод printf, готовый к юникоду? - PullRequest
2 голосов
/ 20 февраля 2012

Уже существует модуль, который предоставляет метод Unicode ready printf, который принимает те же аргументы, что и встроенный printf, но где ширина для заполнения и выравнивания работает с данными Unicode?


Пример:

#!/usr/bin/env perl
use warnings; 
use 5.014;
use utf8;
use charnames qw(:full);
binmode STDOUT, ':utf8';

my %hash = (
    Peter => "the knight",
    Rose => "the dressmaker",
    Franc => "the barber",
    John => "the farmer",
    Lucia => "the baroness",
    Merlin => "the s​o​r​c​e​r​e​r",
    Ace => "the two\N{PRIVATE USE TWO} headed dog",
    Elsa => "the miller",
);

for my $key ( sort keys %hash ) {
    printf "%-15.15s %s\n", $hash{$key}, $key;
}

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Если вас беспокоит ширина Unicode - включая восточноазиатские материалы и комбинирование символов, контрольных кодов и всего остального - и printf, то правильный ответ - вам нужен метод columns из Unicode :: GCString Модуль CPAN.

 use Unicode::GCString;
 my $gcs = Unicode::GCString->new($str);
 my $cols = $gcs->columns;
 printf "%*s\n", $cols, $str;

Другие примеры включают это, чтобы получить длину графемы строки:

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

Это, чтобы перевернуть строку по графеме:

use Unicode::GCString;
$str = reverse Unicode::GCString->new($str);

И эточтобы получить доступ к подстрокам с помощью графемы:

use Unicode::GCString;
my $gcs = Unicode::GCString->new($str);
my $piece = $gcs->substr(5, 5);

Я прошу прощения, что это не в ядре Perl.Тем не менее.

0 голосов
/ 20 февраля 2012

Базовая поддержка ширины символов, как указано в TR11, предоставляется через Unicode :: EastAsianWidth и Unicode :: Property :: XS .Должна быть возможность написать работоспособную замену printf поверх них, но я не знаю, что нужно для полного соответствия.

...