@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.

svn post-commit中文转码

Posted by zeal on 2007-09-01 14:54 , 1669 characters |  + 0 - 0   English
转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/536 MaDe1nZEAL
标签 ( 开发/理论 ):  ,  , 

svn hooks 目录下缺省的 post-commit 脚本模板通过调用 commit-email.pl 来分析当次提交的内容并根据参数设置把修改信息 email 给项目相关人员。脚本支持使用 -m 参数进行正则过滤,当修改不同目录的内容时可以分别 email 给不同的邮件地址。

不过当项目中存在中文文件名的时候,由于 svn 会把非ascii码字符转义成形如 ?\325 的格式,所以在发出来的 email 里面这些中文都变成了不可读的数字。

要把这些编码转回原来的字符,只需要在 commit-email.pl 脚本处理 email body 信息的地方加上一段转码处理即可。比如在 my @difflines; (行487) 的前面加上:

for (my $i=0; $i<@body; ++$i){
    my @rsa = split( /\?\\/, $body[$i] );
    $body[$i] = "";
    for (my $j=0; $j<@rsa; ++$j) {
        my $val = $rsa[$j];
        $val =~ /(^[0-9]{3})(.*)/;
        if($j > 0 and defined $1 and $1 gt 0){
            #print "\n[".$1 . "," . $2."]";
            $body[$i] .= chr($1) . $2;
        }
        else{
            $body[$i] .= $val;
        }
    }
}

把之前 push 到 @body 变量的所有内容重新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符。

另外在 post-commit 模板脚本中没有写 commit-email.pl 的绝对路径,需要写上才能正常被调用。

附: 转码的shell实现->>

echo "?\232?\167?\163?\229?\134?\179?\230?\150?\185?\230?\161?\136" | \
awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}' | \
awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}'

该示例转出来的对应中文应该是:解决方案

Last Modified on 2013-08-27 18:51
没有评论.
日志存档
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
本 Blog 原创内容
遵循以下授权:

Creative Commons
(创作共用) CC

署名-非商业性
-相同方式分享
ZEAL Blog 基于
Powered byPivot - 1.24.1: 'Arcee'
Pivot1.24.1
开发
系统部署于
Linode.com
Launched @
2005-04-27
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号