我读了这篇文章: How to convert hex to char string in perl 将十六进制转换为图表字符串。
如何进行反向操作?我需要在perl中将char字符串转换为十六进制。例如,我有字符串“ 你好,世界!”,我必须得到:
00680065006C006C006F00200077006F0072006C00640021
答案 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
实现。