如何在perl中将char字符串转换为十六进制

时间:2019-05-17 09:49:22

标签: perl

我读了这篇文章: How to convert hex to char string in perl 将十六进制转换为图表字符串。

如何进行反向操作?我需要在perl中将char字符串转换为十六进制。例如,我有字符串“ 你好,世界!”,我必须得到:

00680065006C006C006F00200077006F0072006C00640021

3 个答案:

答案 0 :(得分:5)

这是另一种方法。使用正则表达式一次完成所有操作。

my $string = 'hello world!';
$string =~ s/(.)/sprintf '%04x', ord $1/seg;

答案 1 :(得分:4)

现有答案提供了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以上的字符要好(因为对于0xFFFF以上的字符它仍然只提供4个十六进制数字)。


但是,如果您要处理所有Unicode代码点,则上述解决方案和较早答案提供的解决方案是不够的。

考虑到这一点,我怀疑您实际上是想要Unicode代码点的UTF-16be编码的十六进制表示形式。更糟糕的是,字符大于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;

答案 2 :(得分:3)

您可以使用的一种算法是:

可能的实现方式是

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

该程序的输出为

00680065006C006C006F00200077006F0072006C00640021

也就是说,可能有一个我不知道的pack实现。