Как преобразовать символьную строку в гекс в Perl - PullRequest
1 голос
/ 17 мая 2019

Я прочитал этот пост: Как преобразовать гекс в строку символов в perl преобразовать гекс в строку графика.

Как я могу сделать обратную операцию? Мне нужно преобразовать строку символов в шестнадцатеричный в Perl. Например, у меня есть строка " hello world! ", и я должен получить:

00680065006C006C006F00200077006F0072006C00640021

Ответы [ 3 ]

5 голосов
/ 17 мая 2019

Вот другой подход.Сделайте все это за один раз с регулярным выражением.

my $string = 'hello world!';
$string =~ s/(.)/sprintf '%04x', ord $1/seg;
4 голосов
/ 17 мая 2019

Выходящие ответы обеспечивают шестнадцатеричное представление кодовых точек 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;
3 голосов
/ 17 мая 2019

Один алгоритм, который вы можете использовать для этого:

Возможная реализация может быть

print map { sprintf '%04X', ord } split //, 'hello world!';

Вывод этой программы

00680065006C006C006F00200077006F0072006C00640021

Тем не менее, вероятно, существует pack реализация, о которой я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...