Perl解析RC,RC2文件
来源:互联网 发布:阿里云cdn错误403 编辑:程序博客网 时间:2024/05/20 07:17
我们正在开发的一个软件是国际化软件,所以需要翻译成其他国家的语言。但是对每一次更新实际上需要改动的语言只是一部分,其他一大部分是可重用的。
所以,为了避免代理商再次翻译,我们从原来的版本资源文件抽出了对应的字典文件,并进行替换,达到只翻译一部分改变了的字符串。
这其他还希望用到模糊匹配,但是效果似乎不大,不过还是很有必要的。关于模糊匹配,我看到了《编程之美》里面的一个题目:“判断字符串的相似度”。与这个类似。 以下是部分Perl写的代码: [pl] #根据RC,RC2文件构造字典需要输入两个文件,利用控件ID来对应
1 #!/usr/bin/perl -w 2 use strict; 3 use warnings; 4 5 6 #根据RC,RC2文件构造字典需要输入两个文件,利用控件ID来对应 7 8 ################## 9 #解析.rc2文件 10 sub readRc2File 11 { 12 my $currentLine = 0 ;####读到492多行,addcount=382时的时候竟然结束了! 13 my $fileName = shift; 14 my $hash_ref = shift ; 15 my $encoding = shift ; 16 my $fd ; 17 my $addCount = 0 ; 18 if( $encoding ) 19 { 20 open $fd, "<:utf8", $fileName or die "openFile $fileName error!"; 21 }else{ 22 open $fd, "<:utf8", $fileName or die "openFile $fileName error!"; 23 } 24 my $begin = 0 ; #begin开始标志位 25 my $mul_begin = 0 ; #/**/开始标志位 26 my $str = ""; 27 while(<$fd>) 28 { 29 #$currentLine++; 30 #print "$currentLine: $_"; 31 #过滤多行注释 32 if( m#^\s*/\*# )#if begin with: /* #这里会有问题!当字符串“”里面有注释的时候就会挂-_-!!!所以!必须得开头! 33 { 34 $mul_begin = 1 ; 35 } 36 if($mul_begin) 37 { 38 if( m#.*\*/# ) #if end width */ 39 { 40 #print "Current Line:$currentLine";#addCount = 1670出问题 41 $mul_begin = 0 ; 42 } 43 } 44 else 45 { 46 #在BEGIN\n与END\n里面的就是我们需要的字符串 ##这里出要求BEGIN开头,避免字符串里面出现BEGIN 47 if( m/^\s*BEGIN/ ) 48 { 49 $begin = 1 ; 50 } 51 else{ 52 if( $begin ) 53 { 54 if( /^END/ ) 55 { 56 $begin = 0 ; 57 } 58 else 59 { 60 #处理数据 61 #过滤单行注释 62 if( !m=^\s*(//|#)= ) # if begin with // or # 63 { 64 #处理真正的数据 65 if( m#^[\s|\t]*(\w+)[\s|\t]+"(.+)"# ) 66 { 67 if( !exists( $$hash_ref{$1} ) ) 68 { 69 $$hash_ref{$1} = $2 ; 70 $addCount++; 71 } 72 } 73 } 74 } 75 } 76 } 77 } 78 } 79 } 80 81 ################## 82 #解析.rc文件,.rc文件与.rc2文件不同的地方在于:控件ID在“字符串”后面 ,例如:"C&ounter_Clockwise",IDC_ADVANCE_CCW 83 #rc与文件有点不同 84 sub readRcFile 85 { 86 my $addCount = 0 ; 87 my $fileName = shift; 88 my $hash_ref = shift ; 89 open my $fd, "< ", $fileName or die "openFile $fileName error!"; 90 my $begin = 0 ; 91 my $mul_begin = 0 ; #/**/开始标志位 92 my $str = ""; 93 while(<$fd>) 94 { 95 #过滤多行注释 96 if( m#^\s*/\*# )#if begin with: /* #这里会有问题!当字符串“”里面有注释的时候就会挂-_-!!!所以!必须得开头! 97 { 98 $mul_begin = 1 ; 99 }100 if($mul_begin)101 {102 if( m#.*\*/# ) #if end width */103 {104 #print "Current Line:$currentLine";#addCount = 1670出问题105 $mul_begin = 0 ; 106 }107 }108 else109 {110 #在BEGIN\n与END\n里面的就是我们需要的字符串 ##这里出要求BEGIN开头,避免字符串里面出现BEGIN111 if( m/^\s*BEGIN/ )112 {113 $begin = 1 ; 114 }115 else116 {117 if( $begin )118 {119 if( /^END/ )120 {121 $begin = 0 ; 122 }123 else124 {125 #处理数据126 #过滤单行注释 127 if( !m=^\s*(//|#)= ) # if begin with // or #128 {129 #处理真正的数据130 if( m="(.+?)"\s*,(\w+?),= )131 {132 if( !exists( $$hash_ref{$2} ) )133 {134 $$hash_ref{$2} = $1 ; 135 $addCount++;136 }137 }138 }139 }140 }141 }142 }143 }144 }145 146 147 #####################148 #通过相同ID确定 英文与波兰文的键值关系149 sub getDict150 {151 my $hash_eng = shift ;152 my $hash_pol = shift ;153 my $dict = shift ; 154 while(my ($key, $val) = each(%$hash_eng) )155 {156 $$dict{$val} = $$hash_pol{$key};157 }158 }159 160 ######################161 sub main162 {163 my %hash_eng = () ;164 my %hash_pol = () ;165 my %dict = (); 166 167 print "========READING ENG FILE============\n";168 readRc2File("rc2/Addition_ENU.rc2",\%hash_eng);169 print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n";170 readRc2File("rc2/icad.rc2",\%hash_eng,1);171 print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n";172 173 #readRcFile("rc/IcadRes2_ENU.rc",\%hash_eng);174 #print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n";175 176 177 print "=======READING POL FILE============\n";178 readRc2File("rc2/AdditionPL.rc2",\%hash_pol);179 print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n";180 readRc2File("rc2/icad_POL.rc2",\%hash_pol,1);181 print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n";182 183 #readRcFile("rc/IcadRes2_POL.rc",\%hash_pol);184 #print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n";185 186 getDict(\%hash_eng,\%hash_pol,\%dict);187 writeDict(\%dict,"dict/rc_dict");188 }189 190 191 ######### 程序执行入口 ##################192 main();193 194 195 196 197 ###################tools for test###########################198 199 sub writeDict200 {201 my $dict_hash = shift ;202 my $dict_Name = shift ;203 open my $myfd, " >:utf8", $dict_Name;204 while(my ($key, $val) = each(%$dict_hash) )205 {206 if( $key ne $val )207 {208 print $myfd "$key=\n$val \n" ;209 }210 } 211 }212 213 sub dictSize214 {215 my $hash_ref = shift ;216 my $hash_size = keys %$hash_ref ;217 return $hash_size;218 }219 sub printDict220 {221 my $hash_ref = shift ;222 my $hash_size = keys %$hash_ref ;223 print "\n---------hash_size:$hash_size-----------\n";224 while(my ($key, $val) = each(%$hash_ref) )225 {226 print "$key=\n$val\n" ;227 } 228 }
由于RC文件过于复杂,还没有写出来...~>_<~+
- Perl解析RC,RC2文件
- .rc 和.rc2文件
- VC 资源文件 Resource.h *.rc *.rc2
- VC工程中的.rc文件和.rc2文件的区别
- VC工程中的.rc文件和.rc2文件的区别
- VC工程中的.rc文件和.rc2文件的区别
- VC中rc和rc2资源文件区别
- VC rc文件解析
- Android init.rc文件解析
- vc中的rc和rc2的区别
- Android中init.rc文件的解析
- Android中init.rc文件的解析
- init.rc文件解析过程详解
- Android中init.rc文件的解析
- Android init.rc文件解析过程分析
- rc.sysinit启动脚本文件解析
- Android7.0解析Init.rc文件
- android代码.rc文件结构解析
- .js文件无法运行的方法
- Lua入门
- Perl:过滤注释
- dos中特殊符号命令的应用
- SyntaxHighlighter语言高亮的别名aliases
- Perl解析RC,RC2文件
- perl入门
- 迅雷BoltUI
- 最近在看的书
- 中国分省市地图导航-SVG格式(基于Raphaël)
- 用“Web的思想”做PC客户端
- 异构计算完全解析-CSDN.NET
- 组合模式
- 显示Iframe指定位置