如何修正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"
差异对比
可以看到两处明显差异:
\v转义:我的函数将\v解析为字符v,而GetText保留了\v转义序列- 十六进制转义
\x01009:我的函数将其解析为八进制形式\001009,而GetText实际取最后两位十六进制09,解析为Tab符(对应\t)
请问如何修正uncstring函数,使其解析逻辑与GetText完全一致?
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

