当它们存储在Perl中的不同变量中时,如何从字节创建Unicode字符?

Tom*_*Tom 2 unicode perl hex

我试图将Unicode字符的十六进制表示转换为它们所代表的字符.以下示例正常工作:

#!/usr/bin/perl

use Encode qw( encode decode );
binmode(STDOUT, ':encoding(utf-8)');

my $encoded = encode('utf8', "\x{e382}\x{af}");
eval { $encoded = decode('utf8', $encoded, Encode::FB_CROAK); 1 }
or print("coaked\n");

print "$encoded\n";
Run Code Online (Sandbox Code Playgroud)

但是十六进制数字存储在3个变量中.

所以,如果我用这个替换编码行:

my $encoded = encode('utf8', "\x{${byte1}${byte2}}\x{${byte3}}");
Run Code Online (Sandbox Code Playgroud)

哪里

my $byte1 = "e3"; my $byte2 = "82"; my $byte3 = "af";
Run Code Online (Sandbox Code Playgroud)

它失败了,因为它试图立即评估\ x并看到$符号和{作为字符.

有谁知道怎么解决这个问题.

tre*_*els 12

代替

my $encoded = encode('utf8', "\x{${byte1}${byte2}}\x{${byte3}}");
Run Code Online (Sandbox Code Playgroud)

您可以使用

my $encoded = encode('utf8', chr(hex($byte1 . $byte2)) . chr(hex($byte3)));
Run Code Online (Sandbox Code Playgroud)

hex()从十六进制转换,并chr()返回给定代码点的unicode字符.

[编辑:]

与你的问题无关,但我注意到你utf-8utf8你的程序混在一起.我不知道这是不是一个错字,但你应该是一个这些在Perl中不一样的东西:(
utf-8用连字符,不区分大小写)是UTF-8标准所说的,而utf8(没有连字符,也是这种情况)不敏感)是Perls内部编码,它更松散地定义(它允许代码点不是有效的unicode代码点).一般来说,你应该坚持utf-8(perlunifaq有详细信息).


inn*_*naM 6

特伦德尔的答案似乎相当不错,但Encode :: Escape提供了另一种解决方案:

use Encode::Escape::Unicode;

my $hex = '263a';
my $escaped = "\\x{" . $hex . "}\n";
print encode 'utf8', decode 'unicode-escape', $escaped;
Run Code Online (Sandbox Code Playgroud)