我是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中有什么方法可以实现这一目标吗?
答案 0 :(得分:1)
以下替换似乎对您的输入有用:
s/\\([\$\\])|\$(..)/$2 ? chr hex $2 : $1/ge;
捕获\$
或\\
(如果匹配),请将其替换为$
或\
。否则,捕获$..
并转换为相应的字节。
如果要在Perl中处理结果,请不要忘记从UTF-8对其进行解码。
$chars = decode('UTF-8', $bytes);