在perl上打印包含utf-8字节序列的字符串

时间:2019-05-02 22:11:49

标签: linux perl unicode utf-8 mork

我是perl的新手,我正尝试从mork文件(来自Thunderbird)中打印出folderName。

发件人:https://github.com/KevinGoodsell/mork-converter/blob/master/doc/mork-format.txt

  

第二种特殊字符序列是美元符号   后跟两个十六进制数字,它们给出了   替换字节。通常用于不可打印的字节   作为ASCII字符,尤其是UTF-16文本。例如,一个字符串   Unicode雪人字符(U + 2603):

     

☃雪人☃

     

可以这样用别名表示为UTF-16文本:

     

<(83 = $ 03 $ 26s $ 00n $ 00o $ 00w $ 00m $ 00a $ 00n $ 00 $ 03 $ 26)>

从所有的Thunderbird文件中,我已经看到它实际上是用UTF-8(2到4字节)编码的。

字符串中的以下字符需要转义(以\进行转义才能使用:$)\

示例:aaa\$AA$C3$B1b$E2$98$BA$C3$AD\\x08应打印aaa$AAñb☺í\x08

$C3$B1ñ$E2$98$BA$C3$ADí

我尝试使用正则表达式将未转义的$替换为\x

my $unescaped = qr/(?<!\\)(?:(\\\\)*)/;
$folder =~ s/$unescaped\$/\\x/g;
$folder =~ s/\\([\\$)])/$1/g;   # unescape "\ $ ("

在perl内仅显示文字字符串。

我的解决方法是将其输入bash的printf中,然后成功...除非字符串中没有文字“ \ x”

$ folder=$(printf "$(mork.pl 8777646a.msf)")
$ echo "$folder"
  aaa$AAñb☺í

我咨询过的问题:

Convert UTF-8 character sequence to real UTF-8 bytes 但是似乎它可以单独解释每个字节,而不是按组解释。

In Perl, how can I convert an array of bytes to a Unicode string? 我不知道如何将此解决方案应用于我的用例。

在perl中有什么方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

以下替换似乎对您的输入有用:

s/\\([\$\\])|\$(..)/$2 ? chr hex $2 : $1/ge;

捕获\$\\(如果匹配),请将其替换为$\。否则,捕获$..并转换为相应的字节。

如果要在Perl中处理结果,请不要忘记从UTF-8对其进行解码。

$chars = decode('UTF-8', $bytes);