Выходящие ответы обеспечивают шестнадцатеричное представление кодовых точек Unicode.
Этот формат не позволяет вводу включать символы выше 0xFFFF.Если бы это было разрешено, не было бы никакой возможности узнать, означает ли
20000200002000020000
2000 0200 0020 0002 0000
или
20000 20000 20000 20000
Если это нормально, потому что вы 'Если у вас никогда не будет символов выше 0xFFFF, то я рекомендую следующее:
my $text = 'hello world!';
my $hex = uc unpack 'H*', pack 'n*', unpack 'W*', $text;
Оно должно быть намного быстрее, чем существующие решения, и обрабатывать символы выше 0xFFFF лучше, чем существующие решения (поскольку оно по-прежнему обеспечивает только 4шестнадцатеричные цифры для символов выше 0xFFFF).
Если, однако, вы хотите обработать все кодовые точки Unicode, вышеприведенное решение и решение, представленное в предыдущих ответах, не подходят.
Имея это в виду, я подозреваю, что вы действительно хотите шестнадцатеричное представление кодировки UTF-16be кодовых точек Unicode.Хуже того, наличие символа выше 0xFFFF будет по-прежнему давать полезный результат без потерь.
Code Point Perl string lit JSON string lit Hex of UCP Hex of UTF-16be
------------ --------------- --------------- ---------- ---------------
h (U+0068) "\x{68} "\u0068" 0068 0068
é (U+00E9) "\x{E9} "\u00E9" 00E9 00E9
ጀ (U+1300) "\x{1300} "\u1300" 1300 1300
? (U+20000) "\x{20000} "\uD840\uDC00" 20000 D840DC00
Если это так, вам нужно
use Encode qw( encode );
my $text = 'hello world!';
my $hex = uc unpack 'H*', encode 'UTF-16be', $text;