如何在Perl中将一系列字符(十六进制)打印为UTF8字符?

3

我在Perl中有一个变量,它只是一个字母和数字的序列:

最初的回答:

my $var = "48656c6c6f20576f726c64";

该序列代表字符串Hello World
也就是说,可以将其视为Hello World的十六进制表示形式0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64
如何将$var作为可读的UTF8打印出来?
简短地说:如何打印Hello World
最初的回答。
2个回答

2
获取文本:

要获取文本:

use Encode qw( decode_utf8 );

my $hex   = "48656c6c6f20576f726c64";
my $bytes = pack('H*', $hex);
my $text  = decode_utf8($bytes);

打印它:

use feature qw( say );
use open ':std', ':encoding(UTF-8)';

say $text;

2
使用 pack 函数。最初的回答。
print pack("H*", $var);

最初的回答:如果数据在解码后确实是UTF-8编码的,或者说数据确实是UTF-8编码的。
use Encode;
print Encode::decode("UTF-8", pack("H*", $var));

感谢(最快)答案!完美运作!对于任何阅读此内容的人,我还添加了binmode STDOUT,": utf8";。我有一些“宽字符”。 - undefined
@user2426316,你绝对不应该使用 :utf8。正确的写法是 binmode STDOUT, ":encoding(UTF-8)";,而且你还应该对 STDIN 和 STDERR 做同样的处理。使用 use open ':std', ':encoding(UTF-8)'; 可以一次性完成所有操作。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接