·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 非标汉化 >> ASCII资源的汉化(1)    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

ASCII资源的汉化(1)

作者: 伟乾 来源:汉化教学 时间:2003-08-05 点击:15920

ASCII资源的汉化(1)   

伟乾

一、ASCII 简介

ASCII 它是个难题,使人目眩神迷,逃避或许可以,汉化还真不容易!

     在软件汉化中,ASCII字串的汉化,让每个汉化人都觉得头痛。大量繁琐的手工操作,既没有理想的汉化工具,汉化稍微不小心,就容易出错。比起VC 和 delphi 标准资源的汉化,逊色不小。
    到底什么是 ASCII字串?ASCII的全称是:American national Standard Code for Information Interchange(美国国家信息交换标准代码)。ASCII是计算机技术、信息业中广泛使用的一种标准代码,其中的每个字串(包括图式符和控制符)用一个 8位二进制的代码来表示。 delphi、c++ builder的rcdata资源其实就是 ASCII字串。下面是我用 eXeScope 常规方式/二进制方式 查看同一段的delphi标准资源的代码:(图 1)




object PrintBut: TBitBtn
Left = 5
Top = 4
Width = 72
Height = 25
Hint = 'Print the Current Document'
Caption = '&Print...'
TabOrder = 0
OnClick = PrintButClick
Glyph.Data = {

图 1 


    你一定觉得奇怪,这些的标准资源使用Language Localizator 、exescope等工具汉化非常容易,怎么说是“难题”。实际上我们汉化人说的ASCII字串一般指的是:无法使用常用的本地化工具(Visual Localize、Language Localizator)或资源编辑软件(exescope、reshacker)提取的,但是在运行时会显示出来的提示信息的ASCII字串。表现在:明明已经把程序的标准资源的所有的字串都汉化了,软件运行仍然有一些字串是英文,有些字串明明是汉化了的,运行后却显示英文!本文所说的ASCII 字串都是非标准资源的ASCII字串。
   ASCII字串的汉化一直没有比较理想的工具,传统的方法是使用Utraedit(最好是5.0版本)逐个寻找,逐个翻译修改。这种方法非常累人,理论上能够比较彻底的翻译剩余的英文词条,但实际操作时,在Utraeidt 灰蒙蒙的窗口,面对成百上千的字串,只能挑着汉化。还要养成每翻译几句就存盘,运行软件测试的习惯,方便快速找到出错的地方。万一测试不彻底(很难避免),到全部汉化完才发现问题,唯一的办法就是重新汉化。另一种的传统方法是使用字串提取工具(中文工具箱)把ASCII字串萃取出来,翻译、写入文件、测试、然后再用utraedit修正,比起前一种方法,把萃取ASCII字串的工作交给电脑完成,使用自己喜欢的文本编辑软件对字串进行翻译,翻译集中一起做,提高了效率。更重要的是,测试时发现问题,我们只能恢复原英文文件,用排除法,把翻译的文本一部分一部分的写入,可以很快的找到出错的地方。缺点是,中文工具箱提取字串速度很慢,自动翻译的效果很差,花在修正的时间还多于自己翻译的时间,最后最后使用 Utraeidt 对文件进行修正,十分不便,甚至不如第一种方法。也不是理想的方法。ASCII字串的汉化问题,一直困惑着汉化人。新千年钟声敲响之际, ChinEase 简体汉化节点 的一篇汉化心得《梅花三弄》,吹响了向ASCII汉化进攻的号角。提出了用 Hexworkshop 代替我们一直使用的Utraedit 进行翻译后的修正工作的方法,利用这个软件强大的文件比较功能,比较汉化ASCII字串前后的文件,大大减轻了修正的工作量。在文中第一次揭示了delphi类ASCII字串的格式规律,解决了一些汉化一直没能解决的问题。这篇文章在国内汉化进程中占有非常重要的位置,在这以后,明白、梁利锋解决了ASCII字串汉化后字串变长、字体字号的等问题,梁兄还针对中文工具箱的不足,研制的字串替换器萃取字串速度很快,独特的字典功能解决了中文工具箱乱翻译的问题、可以利用旧版本的翻译文本快速升级。
    虽然现在对于ASCII字串汉化,比起以前已经方便很多,解决了很多的难题。遗憾的是,离理想的、成熟的 ASCII字串汉化工具还很远。我心目中的ASCII字串汉化工具,萃取字串要准确、快速,要能够使用以前积累的字典汉化,能够利用以前版本快速升级,具有独立的字串编辑汉化界面,不需要利用其他工具作这一步。(类似李国印的软件汉化2000)在软件汉化2000这个字串编辑汉化界面上,我希望加入字典翻译的功能,有一个按钮,选择它,就会象中文工具箱那样翻译,自动提取热健。这样把翻译控制到一定的范围(单个字串),避免了乱翻译的问题。在汉化具体字串时,要自动显示中、英文文件相关位置的这个字串的信息,并可以在这里进行修改。具有测试软件,一定次数的撤销、恢复等功能。

二、ASCII 字串的分类

    ASCII字串一般可划分为长度 ASCII字串RVA ASCII字串两类,这分类我沿用了台湾中文化作者六手修罗的分类命名。

    (一)、长度 ASCII字串

    由多个相对集中分布在某些位置的ASCII字串组成一个字串组,字串一个接着一个排在程序中,在字串组的开头,有一个字串组长度标示符,记录了字串组的长度。其格式如下:字串组长度标示符+字串1+字串2+字串3+....+字串n
    长度 ASCII字串
还可以细分为几类:
    1.
结构字串组:字串之间以00间隔,而且只能以一个00间隔,在第一个字串的00前面有一个代表这几个字串数据长度(16进制)的字串组长度标示符。其格式如下:字串组长度标示符+00+字串1+00+字串2+00+字串3+....+字串n 。
   
如图2,4个字串<ProjextSettings>  <Pr&ject Settings...> <Update projext settings><Project Settings>构成了一个字串组,之间用一个00间隔,这个字串组的16进制长度(包括间隔的00)为4E,就是图中黑色背景的字串,不包括字串组最后的00。 




 图 2


    2. 阵列字串组:字串是通过字串的长度标示符判断字串的开始和结束,字串之间没有间隔,在这些字串组前面的两个字串代表字串的个数(16进制),前面第三、四个字串代表这个数据段的字串组的总长度(16进制)(包括字串组个数标示符)。其格式如下:字串组长度标示符+字串组个数标示符+字串1长度标示符+字串1+字串2长度标示符+字串2+字串3长度标示符+字串3+....+字串n长度标示符+字串n 
    如图3,这个字串组由8个字串组成,每个字串前面都有一个字串的长度标示符,字串之间没有间隔,0008代表这个字串组有 8个字串组成,0055代表字串组的长度标示符,图中黄色背景的字串。字串组前后都有00间隔。




图 3 


     图 4例子中,0158代表字串组的长度标示符,0007代表字串组的字串个数。这个例子中我们见到一个00字串,这个00字串超出了它前面字串的字串长度标示符的范围,代表了一个空的字串,在程序中表示这个位置不显示任何字符。图 5的例子也类似。




 图 4





 图 5


    3. 独立字串:这类字串一般出现在VB编译的程序中。字串之间间隔稍远,字串前后各有一个00间隔,在字串的00前面有一个代表字串数据长度(16进制)的字串长度标示符。其格式如下:字串1长度标示符+00+字串1+00+...+字串2长度标示符+00+字串2+00+...+字串n长度标示符+00+字串n+00 。
     
如图 6,在字串长度标示符的前面两个字串都是1303,我们从其他例子中发现这两个字串不尽相同,可能是不同的控件代码。




 图 6



    (二)、RVA ASCII字串

    由多个相对集中分布在某些位置的ASCII字串组成一个字串组,分为 RVA字串组和字串组两部分,RVA字串组是字串的相对虚拟地址的集合,一般位于字串组的前面,可能和字串组一起或距离很近,每个RVA字串为 4个字节,RVA字串的间隔不固定,不过距离很近。字串组由多个字串组成,一个接着一个排在程序中,字串以00结束,字串和后面的多个00间隔符的长度是 4的倍数。
   其格式如下:RVA字串1+...+RVA字串2+...+RVA字串3+....+RVA字串n
                     字串1+字串2+字串3+...+字串n
    RVA ASCII字串
可以细分为两类:
    1.
C 语言字串:格式较简单,字串后面至少有一个ASCII值为“00”的字串与其他字串分开,如图7:




 图 7






 图 8,9


      每个字串以00为字串结束符,与下一字串至少有一个以上的00间隔,字串的长度与字串后面的00字串的总长度是 4的倍数。如图,字串2<New>字串长度为3,后面的00字串长度为1,合计为4;字串3<Open>字串长度为4,后面的00字串长度为4,合计为8;字串4<Add>字串长度为3,后面的00字串长度为5,合计为8.....
    我们前面说:RVA字串组一般位于字串组的前面,可能和字串组一起或距离很近,每个RVA字串为 4个字节,RVA字串的间隔不固定,不过距离很近。一般情况都是如此,不过少数情况下,RVA字串位于字串的后面,RVA字串之间距离很远。如图8,9,RVA字串1在字串的前面,RVA字串2,3,4,5,6,7在字串的后面,RVA字串1RVA字串2,3,4,5,6,7间隔很远。


    2.
Pascal语言字串:格式相对复杂些,字串后面不但有至少一个ASCII值为“00”间隔,而且在字串第一个字符前四个字串都是该字串的长度标示符,前第五、六、七,八个字串是ASCII码值为“FF”的字串,如:FF FF FF FF 02 00 00 00 C4 E3(图10)。Pascal语言字串只有用Pascal语言(delphi、c++ builder)来编写的程序才有。
     图10中,字串长度标示符是  02 00 00 00  ,字串的长度是 2(16进制);图11,字串长度标示符是 DE 01 00 00 ,这个字串的长度是1DE(16进制)。从两个例子我们可以看出,字串第一个字符前四个字串应该都是该字串的长度标示符,长度标示符的低位在前,高位在后。




 图 10





 图 11



     每个字串也是以00为字串结束符,与下一字串至少有一个以上的00间隔,字串的长度与字串后面的00字串的总长度也是 4的倍数。图12中,我们看到 RVA 字串位于字串的前面,而且相对集中。






 图 12


 

 

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): ASCII 教程

·上一篇: 汉化问题——国旗修改问题解决方法 ·下一篇: ASCII资源的汉化(2)

· 版权申明: 本文引自《汉化教学》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化教学》[ 作者: 伟乾],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号