杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3144|回复: 0

ASCII 资源的汉化

[复制链接]
发表于 2015-1-23 16:24:11 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x

作者: 伟乾
来源:汉化新世纪
源地址:http://teach.hanzify.org/article/43-1060012800.html


一、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 = {
asc01.gif
图 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




asc02.gif
 图 2


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




asc03.GIF
图 3 


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



asc04.GIF
 图 4




asc05.GIF
 图 5


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




asc06.GIF
 图 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:




asc07.GIF
 图 7




asc08.GIF
asc09.GIF
 图 8,9


      每个字串以00为字串结束符,与下一字串至少有一个以上的00间隔,字串的长度与字串后面的00字串的总长度是 4的倍数。如图,字串2字串长度为3,后面的00字串长度为1,合计为4;字串3字串长度为4,后面的00字串长度为4,合计为8;字串4字串长度为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进制)。从两个例子我们可以看出,字串第一个字符前四个字串应该都是该字串的长度标示符,长度标示符的低位在前,高位在后。




asc10.GIF
 图 10





asc10a.GIF
 图 11



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




asc11.GIF

asc12.GIF
 图 12



二、ASCII 字串的汉化修正

    对ASCII字串的汉化,现在比较好的方法是,把翻译和修正工作分开。首先利用字串提取替换工具,把ascii字串萃取出来,经过翻译、再写入文件中。然后,使用 16进制编辑工具,对汉化有问题、或不完美的地方,进行个别修正。字串替换工具我们推荐字串替换器CXA,16进制编辑工具我们推荐Hexworkshop
?我们使用字串替换器汉化写入文件后。运行汉化后的程序,虽然界面都变成中文了,但出现碍眼的断行、换行、文字之间空格、文字偏向一侧等问题。造成这问题的原因是汉化后的字串与汉化前的英文字串长度发生变化,大多数情况汉化后字串长度变短,我们写入exe文件时,不足的用空格填充(20)(字串替换器可以用 00 填充不足),造成文字断行、换行、偏向一侧、文字之间的空格的现象。个别情况,汉化后字串长度变长,造成不够位置写入,如add ,只好翻译为加,这样的界面令人很不满意。下面我们讲讲如何处理这些问题!

(一)、ASCII汉化后字串变短的处理

  字串汉化后,字串变短,我们使用字串汉化工具写入时,在大多数情况都可以用20填充不足,在界面中看不出问题。只有字串在界面居中显示、字串后面跟着字串或变量、浮动提示、界面根据字串的长度自动调整大小的等情况下,会出现文字显示位置不好看、字串间出现奇怪的空格、断行、断句等等现象。

 1.结构字串组:

    前面我们介绍这类的字串类型,字串是通过判断00作为字串的结束。字串之间以00间隔,而且只能以一个00间隔,在第一个字串的00前面有一个代表这几个字串数据长度(16进制)的长度标示符。所以我们汉化时,只能用空格(20)填补空格,绝对不能用00填补不足。除了第一个字串不能改变位置,其他的字串可以调整位置,如图13



asc02.gif

asc13.gif
asc14.gif
图 13


      图13,14 举的例子是VC++编译的 pkg文件,我们可以把多余的空格20删去,修改字串组的长度标示符,程序运行显示正常,这说明第一个字串的位置也不是不能改变的,我们也可以增加字串。由于没有在exe,dll文件中找到这样的例子,不知道是否通用。
    如果字串间超过一个00间隔,会导致后面的字串显示出现问题。如图14




asc15a.gif

asc15b.gif    asc15c.gif
 图 14


    2. 阵列字串组:

    这种字串类型,字串之间没有间隔。在这些字串组前面的两个字串代表字串的个数,前面第三、四个字串代表这个数据段的字串组的总长度(16进制)(包括字串组个数标示符)。
    这类的字串,如果我们用空格20填补不足,在某些情况显示会有问题(如图15)。我们只需要把20改为00,就解决了问题。注意:这时不要修改字串的长度标示符,否则会出现后面显示的字串错位的现象。如图,我们看到,只要00是在这个字串长度标示符长度范围内,显示正常;如果00不在长度标示符长度范围内,就会出现字串显示移后的现象,有多少个00在控制范围外,就会移后显示多少个位置。图中有一个00在长度标示符控制范围外,所以后面的字串显示都依次移后一位!




asc16a.gif asc16b.gif asc16c.gif

asc16d.gif
asc16e.gif
asc16f.gif
 图 15


    3. 独立字串:

     这类字串一般出现在VB编译的程序中,字串前后各有一个00间隔,在字串的00前面有一个代表字串数据长度(16进制)的字串长度标示符。我们汉化时,如果使用空格(20)填补不足,在某些情况下,导致显示的界面不美观。
      在图16中,由于汉化后的字串比英文字串短,导致出现三种情况的不足。如图所示,第一种情况出现在边框线连接着字串,使用空格填补不足,导致边框线不能紧接着汉化后的字串。第二种情况,当选择某项时,一般会有个虚框框住所选字串,使用空格填补,出现虚框的显示不足。第三种情况,字串是居中显示的,使用空格填补不足,导致显示不能居中。
      我们只要把20改为00,就是说,使用00填补不足,上述的问题均可解决。注意:这时不要修改字串前面的长度标示符,否则程序无法进行这项功能。就是说我们必须保证有且只能有一个00在字串长度标示符长度范围外,否则会出错。



asc21a.gif asc21b.gif asc21c.gif
asc21d.gif
asc21e.gif
asc21f.gif
 图 16


    4. C 语言字串:



asc17a.gif
asc17b.gif
asc17c.gif
asc17d.gif
图 17


图17中,字串是浮动提示,我们汉化后用空格20填补不足,就会造成提示后面出面空白,我们把20改为00即可。实际操作时,只需把第一个20改为00就可以了。我们再看下一个例子(图18



asc18a.gif

   asc18b.gif asc18c.gif asc18d.gif
 图 18


图 18中的字串在界面是居中显示,我们汉化后用空格20填补不足,就会造成提示后面出面空白,我们把20改为00即可。实际操作时,只需把第一个20改为00就可以了。


      5.
Pascal语言字串:
    图19 的例子,是一个按钮的字串,文字在按钮中是居中显示的。我们汉化后,字串变短,用空格填充不足,造成文字偏向左侧,不太美观。我们只需把 20 改为 00 即可,看看是不是好看多了。
    实际操作中,我们只需在字串后面把一个 20 改为 00 即可,不需要把所有的20 改成 00。因为ASCII是以 00 为结束,我们只要保证字串的后面有一个00就行了。在这个例子中,我们没有修改长度标示符为字串实际的长度,字串的显示效果也正常。



asc19a.gif

   asc19b.gif   

                                     图 19
asc19c.gif asc19d.gif


    但在一些情况下,必须修改长度标示符,才能得到满意的效果。如图 20,在消息窗口显示的信息是由多个字串组成的。[You did nit select a page, or pages, of bookmarks to ]这是第一个字串,它的16进制长度为35,后面跟着其他字串。



asc20a.gif

   asc20b.gif   

图 20


    我们按照上面的方法汉化修改,发现后面的字串不见了。




asc20c.gif

   asc20d.gif   

图 21


       我们把长度标示符 改为实际的长度 1E我们把长度标示符修改后,显示基本正常,发现[HTML]后面跟着的 [.]中间有空格。仔细研究才发现,这个信息是由三段字串组成,第二个字串就是我们前面举的例子[创建HTML]字串,第三个字串是英文的句号[.]。我们前面没有修改[创建HTML]字串的长度标示符,在这个消息窗口调用了[创建HTML]字串,所以出现空格现象。我们把[创建HTML]字串的长度标示符修改为实际的长度,显示正常。在这里我们看到这个信息窗口的宽度是根据字串的程度自动调整的。  




asc20e.gif

   asc20f.gif   
asc20g.gif

图 22


       小结:综上所述,除了第一种字串(结构字串组),其他的字串我们汉化时,如果字串变短,均可以使用00填补不足。由于第一种字串比较少见,所以使用00填补不足大多数情况下都适用。在我们使用的字串替换工具中,只有梁利锋的字串替换与香港黄权粲的cxa具有这样的功能,为我们汉化提供了便利。在各种字串抓取替换工具,中文工具箱(CKIT)李国印的软件汉化2000由于提取字串的速度慢,作者停止开发或开发暂停,我们不建议大家使用。最近还在开发的字串提取替换工具,有香港黄权粲的CXA和大陆梁利锋的字串替换器。这两个工具,提取字串的速度较快,而且各有特点。CXA沿用传统的字典翻译功能,不过针对字典翻译效果不佳的情况,作了改进,使用二次翻译调整,翻译的效果大大改进。对于不以00结尾的字串,可以自动拆分字符串,添加不需要翻译的字串,提取字串比较准确。新版本增加了分段翻译、测试等管理功能。字串替换器采用匹配替换代替了以往的翻译功能,使 ASCII字串的批量汉化(快速汉化升级)成为可能。同样具有分段翻译、测试等管理功能,它的开发意念最贴近汉化人。不过最近版本0.93,对阵列字串组提取的效果不佳,希望以后的版本改进。


(二)、ASCII汉化后字串变长的处理

    在一般情况下,英文翻译成中文后的字节数会比原来英文的字节数少,也就不存在不够位置回写的问题,但是当英文为“yes,add,new”等等,翻译后字节变大,不够位置来回写,只能译成“是,加,新”或不翻译。
    在明白的文章中讲解的字串都是RVA ASCII字串,也只有RVA ASCII字串才需要通过调整偏移代码来增加字串的长度。对于长度ASCII字串,我们只要按照有关字串的格式,取长补短,调整字串之间的位置,就可以达到增加字串长度的目的。
    (一)、长度 ASCII字串

    1. 结构字串组
    我们只要保证字串间有且只能有一个00间隔,保持整个字串组的完整性。字串之间互相调整位置,达到增加字串长度的目的。

    2. 阵列字串组
    由于这种字串间没有间隔符,是通过字串标示符定义字串的结束,所以我们调整字串时,需要同时修改字串标示符。

    3. 独立字串
    这类字串我们一般出现在VB开发的程序,我们调整字串时,保持字串的格式,同时修改字串标示符。

   (二)、RVA ASCII字串:
   
RVA字串分为 RVA字串组和字串组两部分,RVA字串记录了字串的相对虚拟地址(就是在内存中的地址)。我们可以通过修改RVA字串,调整字串的开始位置,取长补短,解决字串长度不足的问题。字串的相对虚拟地址可以从以下的公式得出:
               
字串的相对虚拟地址=字串在文件中的偏移+基偏移
                基偏移=imagebase(基地址)+区段RVA-区段offset
    对于大多数的使用VC或DELPHI编译的程序来说,基偏移是固定的,VC的基偏移是400000H,而DELPHI则是400C00H。不过也有例外,我们就要从文件的区段表中,查出当前字串的位置(在文件中的偏移)是处在哪个区段,然后计算出字串的基偏移。
    许多工具都可以显示文件的基地址、区段、区段RVA、区段偏移、区段大小等信息,如exescope、W32dasm、Prucdump等等。




Disassembly of File: winimp32.exe
Code Offset = 00000400, Code Size = 0003BE00
Data Offset = 0003DE00, Data Size = 00012000

Number of Objects = 0006 (dec), Imagebase = 00400000h

   Object01: AUTO       RVA: 00001000         Offset: 00000400      Size: 0003BE00           Flags: 60000020
   Object02: .idata     RVA: 0003D000         Offset: 0003C200      Size: 00001C00           Flags: C0000040
   Object03: DGROUP     RVA: 0003F000         Offset: 0003DE00      Size: 00012000           Flags: C0000040
   Object04: .bss       RVA: 00051000         Offset: 00000000      Size: 00005E00           Flags: C0000080
   Object05: .reloc     RVA: 00057000         Offset: 0004FE00      Size: 00004000           Flags: 42000040
   Object06: .rsrc      RVA: 0005B000         Offset: 00053E00      Size: 0001D600           Flags: 40000040


     我们可以知道,文件有AUTO .idata DGROUP .bss .reloc .rsrs等区段,区段的开始位置是Offset),区段的大小是Size),区段的结束位置是Offset+Size)
     我们首先判断字串的偏移是位于哪个区段,然后利用基偏移的公式算出基偏移的值。字串RVA=字串的偏移+基偏移,RVA字串为 4个字节,数值低位在前、高位在后,反转过来。然后查找字串的RVA值,验证是否字串的RVA,修改。
     在实际操作时,我们使用 RVA转换器很容易查出字串RVA的值。
   以 WinImp 1.11 中的第二个工具按钮 Open 为例,这个 Open 在可执行文件中的偏移为 49EB0h 。首先使用
RVA ConverterRVA 转换器)装入文件,在Convert offset (转换偏移量)选择 File to RVA字串偏移转换为RVA),在File字串偏移)中输入字串的偏移量,字串的RVA值可以从RVA栏查到,同时我们还可以知道这个字串所处区段、区段的偏移、大小等信息。字串RVA值是“44B0B0”反转过来就是“B0B04400”,然后查找“B0B04400”。一般同一字串组的RVA都是在一起的,我们可以通过这来判断找到的地方是否正确。




asc22.gif
图 23


    在最后修改本文时,发现我们汉化人的好朋友梁利锋开发了类似的工具---偏移量转换器(posconv) 0.92 版,增加了支持十进制,做字节翻转,把结果送到剪贴版等功能,更加好用,强烈推荐!



asc23.gif
图 24



    1.C 语言字串
   
我们前面介绍了这种字串以00为字串结束符,与下一字串至少有一个以上的00间隔,字串的长度与字串后面的00字串的总长度是 4的倍数。汉化时,如果字串后面有超过一个以上的00,我们只要保证字串间有一个00间隔,其它的00用来增加字节。
   如果字串后面只有一个00间隔或多出的00不够增加字节用,我们就需要通过修改字串RVA来增加字串的长度。




asc07.GIF
 图 7



     如图,这里有两个字串(New , Add)汉化后长度变长。其中字串 Add后面00有5个,我们只要保证至少有一个00与后面的字串间隔。我们汉化为添加,有足够的位置。字串New后面只有一个00,不够位置写入,而后面的字串Open汉化后字串长度不变,字串后面的00有四个。我们只要把字串Open后移一位,就可以满足字串New的需要。因此我们需要修改字串Open的RVA值,把它加1。
    我们使用 RVA 转换器 算出字串Open的RVA值为44B0B0,我们需要把44B0B0修改为44B0B1,由于RVA字串为 4个字节,数值低位在前、高位在后,在文件里是以B0B04400的数值存在,我们只要查考B0B04400修改为B1B04400,这个文件中查找到两处有B0B04400,我们逐个修改,然后运行程序,就知道那个是真那个是假的RVA值了。
    一般我们修改字串的RVA值,字串都不会移动很远,我们往后移动字串多少字节,RVA值 就加多少;往前移动字串多少字节,RVA值 就减多少。有时候,我们会碰到这样的情况,在字串附近实在没有多余的空间增加字串的长度或者有空间但需要移动很多的字串,修改很多字串的RVA值。这个时候,我们可以在文件的其他空的位置(都是00的地方),覆盖状态下,输入字串,然后使用
RVA 转换器 根据字串当然的偏移转换算出 字串当前的RVA值,把当前的RVA值替换原来的RVA值即可。

   2.Pascal语言字串格式相对复杂些,字串后面不但有至少一个ASCII值为“00”的字串分开,而且在字串前第五、六、七,八个字串是ASCII码值为“FF”的字串,如:FF FF FF FF 02 00 00 00 C4 E3(图10)。除了跟C 语言字串那样利用多出来的00字串增加字节外,由于字串一般一个接一个聚集在一起,实际上程序只需要有一个FF来作为字符串标识,我们保留一个FF来作为下一个字串的标识符,所以实际上我们又可以增加3个字符(不过这个方法有时会导致程序出问题)。
     如果还不够空间增加字节,我们就需要通过修改字串RVA来增加字串的长度,具体方法跟上面相同。不过需要注意的是,必须保持Pascal语言字串的格式,字串的前面4个字符是长度标示符,前面第五个字符是  FF(必须的),第六到八字符也是FF(有时可以不要)。具体的方法与上面相同,详细的使用可以参考明白的文章《汉化ASCII字符串的高级技巧》




asc10.GIF
 图 10


三、后记
  
   
至此,ASCII字串的格式、汉化的处理已经介绍完毕。与其说是写,不如说是整理。自从年初第一篇ASCII字串的汉化文章《梅花三弄》(ChinEASE)发表后,明白、梁利锋等人也发表了不少关于ASCII字串的汉化文章,使我们的汉化技术更上一层楼。拜读这些文章,加上平时积累的一些经验,一直想写一篇ASCII汉化的文章,尝试把ASCII字串归纳总结。ASCII资源的汉化的第一稿刚刚写好,就看看台湾中文化作者六手修罗的文章《调整ASCII字串的长度》。文中的ASCII字串的分类、介绍让我大开眼界,马上按照他的分类重头再写。由于水平有限,期间向多位汉化人、网友请教,指正了文中不少错误的观点。特别感谢ChinEase提供许多ASCII字串的特例,指正了许多 ASCII格式的错误之处。感谢六手修罗给三种长度ASCII字串命名,使小弟的文章有了一点专业的味道^-^。还要向梁利锋大侠说声谢谢,由于我对编程一窍不通,为了一些浅显的常识多次麻烦梁兄,还纠缠不清,让你受累了。还有......
    修改第二稿时,意外地发现了一个
RVA转换工具。这个工具应该99年就有了,对于ASCII的格式也早有前人总结过,更开发出工具。除了汉化界本身要团结一致,多做交流合作。更要向编程、破解的高手虚心请教,积极引进技术、工具,才能促进汉化事业的发展!
    由于我接触的软件不多,可能有些 ASCII字串无法按文章的分类入座。如果你汉化时,发现新的ASCII字串格式或有一些心得。请写出来,和我们大家一起分享。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-16 06:59 , Processed in 0.123684 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表