【问题标题】:How to convert char string to hex in perlperl中如何将char字符串转换为十六进制
【发布时间】:2019-10-04 15:15:45
【问题描述】:

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

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

00680065006C006C006F00200077006F0072006C00640021

【问题讨论】:

  • 你想如何处理大于 0xFFFF 的字符?

标签: perl


【解决方案1】:

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

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

【讨论】:

  • 并使其适用于任何字节(例如包括 \n)([\x00-\xff]) 将优于 (.)
  • @FlorianB, 1) . 已经匹配换行符,因为 /s 2) 你为什么要不必要地将自己限制为前 256 个 Unicode 字符?!
【解决方案2】:

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

一个可能的实现可能是

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

这个程序的输出是

00680065006C006C006F00200077006F0072006C00640021

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

【讨论】:

  • 我得到了uc join "", unpack '(H2)*', pack '(xa)*', split //, $input 的预期输出。我不知道如何缩短它:-)
  • @choroba,将 '(xa)*' 替换为 'n* 以处理最大为 0xFFFF 的字符,而不是最大为 0xFF 的字符。通过该修复,将join "", unpack '(H2)*', 简化为unpack 'H*',,并将split 替换为unpack 样式,我们得到:uc unpack 'H*', pack 'n*', unpack 'W*', $input
【解决方案3】:

现有答案提供了 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;

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2020-07-18
    • 1970-01-01
    • 2013-02-07
    • 2010-12-04
    相关资源
    最近更新 更多