You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Perl的uncstring函数以匹配GetText的转义序列解析?

修正PO文件转义序列解析逻辑以匹配GetText行为

我需要按照PO文件格式定义解析双引号字符串,需识别的转义序列包括:

  • 字符转义:\a、\b、\f、\n、\r、\t、\v、\\、\"
  • 十六进制转义:\xh...(h代表十六进制数字)
  • 八进制转义:\o、\oo、\ooo(o代表八进制数字)

测试用例

file.po内容如下(重点关注msgstr行的字符串):

msgid  "test"
msgstr "BEL \a BS \b FF \f LF \n CR \r HT \t VT? \v BSOL \\ QUOT \" HEX? \x01009 Y2 \1712"

现有解析函数

我用eval实现了一个解析函数:

sub uncstring {
    local $_ = substr((shift), 1, -1); # 去除首尾双引号
    s/
        \\ ( [abfnrtv\\"] | x [[:xdigit:]]+ | [0-7]{1,3} )
    /
        eval "\"\\$1\""
    /xge;
    return $_;
}

测试命令及结果

执行以下命令测试:

perl -MB -lne '
    BEGIN{ sub uncstring { ... } }
    print B::cstring(uncstring($1)) if /^msgstr (".*")/;
' file.po

经B::cstring转义后输出:

"BEL \a BS \b FF \f LF \n CR \r HT \t VT? v BSOL \\ QUOT \" HEX? \001009 Y2 y2"

GetText工具的结果

用msgexec工具测试:

msgexec -i file.po 0 | perl -MB -lp0e '$_ = B::cstring($_);'

经B::cstring转义后输出:

"BEL \a BS \b FF \f LF \n CR \r HT \t VT? \v BSOL \\ QUOT \" HEX? \t Y2 y2"

差异对比

可以看到两处明显差异:

  1. \v转义:我的函数将\v解析为字符v,而GetText保留了\v转义序列
  2. 十六进制转义\x01009:我的函数将其解析为八进制形式\001009,而GetText实际取最后两位十六进制09,解析为Tab符(对应\t)

请问如何修正uncstring函数,使其解析逻辑与GetText完全一致?

内容的提问来源于stack exchange,提问作者Fravadona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:03:23