sprintf 和多列 Unicode 字符

问题描述 投票:0回答:1

我想我掉进了 unicode 的兔子洞,我需要帮助才能摆脱困境。我正在测试如何使用 sprintf 和 unicode 字符串来排列事物,所以我有点期待这个:

use Encode qw/decode encode/;
use utf8;

$\ = "\n"; $, = "\t";

open my $uni, "unicode_strings.txt";
my @in = map { chomp; $_ } <$uni>;

my @l = map {
    my $decoded = utf8::is_utf8($input) ? $input : decode("UTF-8", $_);
    [
     sprintf ("%-32s", $decoded),
     sprintf ("%02i", length($decoded)),
     sprintf ("%02i", length($_)),
    ]
} @in;

print encode "UTF-8", $_ for map { join " | ", $_->@* } @l;

使用此输入:

normal
übung
schön
fähig
niño
crème brûlée
smörgåsbord
добрый день
😊
🌍
你好
こんにちは
안녕하세요
مرحبا
שָׁלוֹם
ज़िंदगी

把东西排列整齐。

相反,一切正常,直到

добрый день
,然后变得像这样混乱(我希望列对齐,我们稍后会处理从左到右和从右到左的问题):

normal                           | 06 | 06
übung                            | 05 | 06
schön                            | 05 | 06
fähig                            | 05 | 06
niño                             | 04 | 05
crème brûlée                     | 12 | 15
smörgåsbord                      | 11 | 13
добрый день                      | 11 | 21
😊                                | 01 | 04
🌍                                | 01 | 04
你好                               | 02 | 06
こんにちは                            | 05 | 15
안녕하세요                            | 05 | 15
مرحبا                            | 05 | 10
שָׁלוֹם                          | 07 | 14
ज़िंदगी                          | 07 | 21

我一直在摸索

Unicode::GCString
,但调整列等似乎没有多大帮助。

有什么想法吗?

perl unicode
1个回答
0
投票

Text::CharWidth 提供了获取字符串宽度的方法。

也就是说,结果的质量将取决于字体并可能显示。

如果正在使用的字体没有您要打印的字形,操作系统可以借用其他字体。这会导致差异。

$ perl -MText::CharWidth=mbswidth -CSD -nle'printf "<%s%s>\n", $_, " "x(15-mbswidth($_))' a
<normal         >
<übung          >
<schön          >
<fähig          >
<niño           >
<crème brûlée   >
<smörgåsbord    >
<добрый день    >
<😊             >
<🌍             >
<你好           >
<こんにちは     >
<안녕하세요     >
<مرحبا          >
<שָׁלוֹם           >
<ज़िंदगी          >

控制台:

Rendered in console

显示的浏览器,但 StackOverflow

Rendered in browser

© www.soinside.com 2019 - 2024. All rights reserved.