Make your own free website on Tripod.com

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


 

 

--* 如果您發現連結錯誤或其它問題,請寫信通知我們
--* 如果您連結本站本地軟體,請註明來自漢化新世紀,謝謝您的支持 !



回教學