Perl解析RC,RC2文件
我们正在开发的一个软件是国际化软件,所以需要翻译成其他国家的语言。但是对每一次更新实际上需要改动的语言只是一部分,其他一大部分是可重用的。
所以,为了避免代理商再次翻译,我们从原来的版本资源文件抽出了对应的字典文件,并进行替换,达到只翻译一部分改变了的字符串。
这其他还希望用到模糊匹配,但是效果似乎不大,不过还是很有必要的。关于模糊匹配,我看到了《编程之美》里面的一个题目:“判断字符串的相似度”。与这个类似。 以下是部分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 else 109 { 110 #在BEGIN\n与END\n里面的就是我们需要的字符串 ##这里出要求BEGIN开头,避免字符串里面出现BEGIN 111 if( m/^\s*BEGIN/ ) 112 { 113 $begin = 1 ; 114 } 115 else 116 { 117 if( $begin ) 118 { 119 if( /^END/ ) 120 { 121 $begin = 0 ; 122 } 123 else 124 { 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 getDict 150 { 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 main 162 { 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 writeDict 200 { 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 dictSize 214 { 215 my $hash_ref = shift ; 216 my $hash_size = keys %$hash_ref ; 217 return $hash_size; 218 } 219 sub printDict 220 { 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文件过于复杂,还没有写出来...~>_<~+