我想我掉进了 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
,但调整列等似乎没有多大帮助。
有什么想法吗?
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 >
<добрый день >
<😊 >
<🌍 >
<你好 >
<こんにちは >
<안녕하세요 >
<مرحبا >
<שָׁלוֹם >
<ज़िंदगी >
控制台:
显示的浏览器,但 StackOverflow