【发布时间】:2019-09-21 11:23:23
【问题描述】:
我是 perl 新手,我正在尝试从 mork 文件(来自 Thunderbird)中打印出文件夹名称。
发件人:https://github.com/KevinGoodsell/mork-converter/blob/master/doc/mork-format.txt
第二种特殊字符序列是美元符号 后跟两个十六进制数字,它们给出的值 替换字节。这通常用于不可打印的字节 作为 ASCII 字符,尤其是在 UTF-16 文本中。例如,一个字符串 带有 Unicode 雪人字符 (U+2603):
☃雪人☃
可以通过这种方式在别名中表示为 UTF-16 文本:
从我看到的所有 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 中实现这一点?
【问题讨论】:
-
如果你省略了最后一个 unescape 替换,你可以简单地使用
eval "\"$folder\"".. 但是使用eval通常是不安全的,所以最好使用例如String::Escape
标签: linux perl unicode utf-8 mork