生活如麻 发表于 2015-12-26 12:02:13

Perl解析RC,RC2文件

  我们正在开发的一个软件是国际化软件,所以需要翻译成其他国家的语言。但是对每一次更新实际上需要改动的语言只是一部分,其他一大部分是可重用的。
  所以,为了避免代理商再次翻译,我们从原来的版本资源文件抽出了对应的字典文件,并进行替换,达到只翻译一部分改变了的字符串。
  这其他还希望用到模糊匹配,但是效果似乎不大,不过还是很有必要的。关于模糊匹配,我看到了《编程之美》里面的一个题目:“判断字符串的相似度”。与这个类似。 以下是部分Perl写的代码: #根据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文件过于复杂,还没有写出来...~>_<~+
页: [1]
查看完整版本: Perl解析RC,RC2文件