如何正确将UTF-8字符串与Perl的printf对齐?

sid*_*com 6 unicode perl encoding

什么是在这里获得漂亮的输出(所有行都相同的缩进)的正确方法?

#!/usr/bin/env perl
use warnings;
use strict;
use DBI;

my $phone_book = [ [ qw( name number ) ],
            [ 'Kroner', 123456789 ],
            [ 'Holler', 123456789 ],
            [ 'Mühßig', 123456789 ],
            [ 'Singer', 123456789 ],
            [ 'Maurer', 123456789 ],
];

my $dbh = DBI->connect( "DBI:CSV:", { RaiseError => 1 } );
$dbh->do( qq{ CREATE TEMP TABLE phone_book AS IMPORT( ? ) }, {}, $phone_book );

my $sth = $dbh->prepare( qq{ SELECT name, number FROM phone_book } );
$sth->execute;

my $array_ref = $sth->fetchall_arrayref();

for my $row ( @$array_ref ) {
    printf "%9s %10s\n", @$row;
}

# OUTPUT:

#   Kroner  123456789
#   Holler  123456789
# Mühßig  123456789
#   Singer  123456789
#   Maurer  123456789
Run Code Online (Sandbox Code Playgroud)

Dan*_*Dan 4

我无法重现它,但宽泛地说,似乎发生的是字符编码不匹配。您的 Perl 源文件很可能已以 UTF-8 编码保存。但是您尚未use utf8;在脚本中启用。因此,它将每个非 ASCII 德语字符解释为两个字符,并相应地设置填充。但您运行的终端也处于 UTF-8 模式,因此字符可以正确打印。尝试添加,我敢打赌您会收到一条警告,如果添加实际上解决了问题,use warnings;我不会感到惊讶。use utf8;

  • 好的,启用“binmode STDOUT,'encoding(utf8)'”也可以工作。 (4认同)