如何将UTF-8字符串与Perl';什么是printf?

如何将UTF-8字符串与Perl';什么是printf?,perl,unicode,encoding,Perl,Unicode,Encoding,在这里获得漂亮输出(所有行都有相同的缩进)的正确方法是什么 我还没有能够重现它,但粗略地说,似乎正在发生的是,它是一个字符编码不匹配。很可能您的Perl源文件已保存为UTF-8编码。但是,您尚未启用使用utf8在脚本中。因此,它将每个非ASCII德语字符解释为两个字符,并相应地设置填充。但是您运行的终端也处于UTF-8模式,因此字符可以正确打印。尝试添加使用警告我敢打赌你会得到一个警告打印出来,如果添加使用utf8,我不会感到惊讶实际上解决了这个问题。如果代码点采用0或2个打印列,而不是1个打印

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


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

如果代码点采用0或2个打印列,而不是1个打印列,则不能将Unicode与
printf
一起使用

你需要改用

错误的方式:

printf "%-10.10s", our $string;
正确的方式:

use Unicode::GCString;

my $gcstring = Unicode::GCString->new(our $string);
my $colwidth = $gcstring->columns();
if ($colwidth > 10) {
    print $gcstring->substr(0,10);
} else {
    print " " x (10 - $colwidth);
    print $gcstring;
}
#/usr/bin/env perl
使用警告;
严格使用;
使用utf8;#这是为了允许在该程序文件中使用utf8(与读取/写入文件句柄相反)
binmode(标准输出“utf8:”);#允许UTF8输出到标准输出
我的@strings=('Mühßig','Holler');#此文件中的UTF8之所以有效,是因为“使用UTF8”
我的$s(@strings){printf(“%-15s%10s\n“,$s,'lined');}应该很好地排列在一起
打开(文件“utf8file”)| | die(“未能打开文件:$!$?”;
binmode(文件“utf8:”);
#与上面相同,但在文件上而不是STDIN上
while()
关闭(文件);
#这也行
使用编码;
打开(文件“utf8file”)| | die(“未能打开文件:$!$?”;
while(){
咀嚼;
$\=解码utf8($);
printf(“%-15s%10s\n”,$",“已对齐”);
}
关闭(文件);

“使用警告;”已经存在,当我添加“使用utf8”时,第三行显示如下:“M�H�ig 123456789”。从文件读取时我也有同样的问题。好的,启用“binmode标准输出,'编码(utf8)'”也可以。@Dan:我启用了警告,但没有收到任何警告。这是更有用的@tchrist答案
use Unicode::GCString;

my $gcstring = Unicode::GCString->new(our $string);
my $colwidth = $gcstring->columns();
if ($colwidth > 10) {
    print $gcstring->substr(0,10);
} else {
    print " " x (10 - $colwidth);
    print $gcstring;
}
    #!/usr/bin/env perl

    use warnings;
    use strict;

    use utf8; # This is to allow utf8 in this program file (as opposed to reading/writing from/to file handles)

    binmode( STDOUT, 'utf8:' ); # Allow output of UTF8 to STDOUT

    my @strings = ( 'Mühßig', 'Holler' ); # UTF8 in this file, works because of 'use utf8'

    foreach my $s (@strings) { printf( "%-15s %10s\n", $s, 'lined up' ); } # should line up nicely

    open( FILE, 'utf8file' ) || die("Failed to open file: $! $?");

    binmode( FILE, 'utf8:' );

    # Same as above, but on the file instead of STDIN

    while(<FILE>) { chomp;printf( "%-15s %10s\n", $_, 'lined up' ); }

    close( FILE );

    # This works too
    use Encode;

    open( FILE, 'utf8file' ) || die("Failed to open file: $! $?");

    while(<FILE>) {
            chomp;
            $_ = decode_utf8( $_ );
            printf( "%-15s %10s\n", $_, 'lined up' );
    }

    close( FILE );