* updated by Kii Ali, 12-11-2001 ftp://ftp.nsysu.edu.tw/cpatch/faq/tech/tech_00or20.txt Subject: 技術_00 或 20 該如何抉擇 ------------------------------------------------------------------------------------------ Date: Mon, 28 Dec 1998 00:11:14 +0800 From: Issac Chang Organization: My Info Company To: patch-post@cpatch.org Subject: 00 或 20 該如何抉擇... 最近在處理一些對話方塊時發現一個有趣的現象,或許大家早已 發現此問題,若此,弟也想聽聽大家的解決方法。 詳情是這樣的:如果對話方塊中的文字是 UniCode 的話,那麼 其中的文字字串長度翻譯前與翻譯後可以不一樣。例如您可以把 "Are you sure?" 翻譯成 "您確定嗎?"(原英文字串長度 13 個字元,翻譯後為 10 個字元)。或者翻譯後比翻譯前更長也無 所謂。 但如果對話方塊中的文字不是 UniCode,而是 ASCII 的話,想 當然爾會祭出 UltraEditor,但有一點要特別注意,每行字最後 一個句點(或是其他符號如冒號,但常見的是句點)的位置之前 不得有插入 Hex 值 00 之情形。否則第接下來的幾行字會消失 無蹤,這情形弟已在數個軟體見過。請看以下說明: (圖一)原對話方塊 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉RoboType ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉ ▉Detected abbreviation "%s" copied to clipboard. ▉參考用,原對話方塊此行為空白行012345678901234567890 ▉Type its replacement? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 原英文對話方塊如上圖一所示。 看到 "Detected abbreviation "%s" copied to clipboard." 翻成 "RoboType 偵測到縮寫字 "%s" 已被複製到剪貼簿. " ==================================================^^^= ^^^以 00 00 00 填入。心中不免對自己的小聰明再度佩服一番 :-) 翻完後執行該軟體以便顯示該對話方塊(如下圖二)。咦!有 不對勁的地方,原來是 "Type its replacement?" 消失了... 這下糗了... (圖二)中文化後對話方塊 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉RoboType ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉ ▉RoboType 偵測到縮寫字 "%s" 已被複製到剪貼簿. ▉參考用,原對話方塊此行為空白行012345678901234567890 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 敲敲頭殼...左思右想...一試再試...終於發現那個該死的句點 (.),也就是未中化前 Hex 值 2E 的位置之前不能補 00。 該怎麼辦呢?只好再度請出 UltraEditor,把句點(.)之後補 成 20 20 20。存檔之後再開一次,這次正確了(如下圖三)。 一定要補 20 嗎?倒也不是如此,弟認為 00 到 FF 間的 Hex 值,只要避過 00 和一些具有特殊意義的如 0D、0A、90、FF 就 可以了。 (圖三) ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉RoboType ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ ▉ ▉RoboType 偵測到縮寫字 "%s" 已被複製到剪貼簿. ▉參考用,原對話方塊此行為空白行012345678901234567890 ▉Type its replacement? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 結論:只要對話方塊中的文字是 ASCII 的話,一行文字最後 的句點或其他符號之前絕不能因為中化後的字串較短而補 00 ,否則就等著跟其下的幾行字說 881 吧。 PS:以上提到的是對話方塊中的文字會發生的情形。但是如果 功能表文字為 ASCII 呢?翻譯後中文字較短能不能補 00,答 案是可以的。至於為何為這樣,小弟也不清楚。知道的朋友是 否可替小弟解惑一下(難道 00 代表換行後不理)。 Best regards, Issac Chang u2504249@mail2.scu.edu.tw http://mail2.scu.edu.tw/~u2504249 進化中... ------------------------------------------------------------------------------------------ From: "Douglas Tsai" To: "中文化作者討論區" Subject: Re: 00 或 20 該如何抉擇... Date: Mon, 28 Dec 1998 15:11:01 +0800 我是阿道史瓦辛格,以下針對Issac Chang的疑問,提出我的看法 在C語言中,0x00是字串結束符號,所以字串中插入0x00即代表此為 字串的結尾。在此例中: > (圖一)原對話方塊 > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ > ▉RoboType > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ > ▉ > ▉Detected abbreviation "%s" copied to clipboard. > ▉參考用,原對話方塊此行為空白行012345678901234567890 > ▉Type its replacement? > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ C原始程式碼應為 "Detected abbreviation "%s" copied to clipboard.\n\nType its replacement?" 其中"\n"是換行符號,以ASCII表示應為0x0d0a,以UniCode表示應為 0x000d 0x000a,所以用UltraEdit看程式碼會看到 0d 00 0a 00 出現在 "Detected ...clipboard" 與 "Type its replacement?" 這兩個字串之間。 一般而言,第一個字串後面填入空白(0x20)即可,Cpatch會自動作 這件事。但是如果空白太多有時會影響到整個對話框(空白換行到下 一行,等等),此時只好用UltraEdit搬一搬,把後一個字串緊接著前 一字串,最後再補0x00。如 "RoboType 偵測到...剪貼簿.\n\nType its replacement?",0x00,0x00,... 如果用pebble就更簡單了,可以直接看出兩個字串實際上是同一個 字串,把中間多餘的空白除去即可。 > PS:以上提到的是對話方塊中的文字會發生的情形。但是如果 > 功能表文字為 ASCII 呢?翻譯後中文字較短能不能補 00,答 > 案是可以的。至於為何為這樣,小弟也不清楚。知道的朋友是 > 否可替小弟解惑一下(難道 00 代表換行後不理)。 只要原始程式是以C寫的(許多軟體是的),而兩個字串實際上是中間 插入"\n"的同一個字串,應該就會有這種情形。用pebble等軟體可以 判斷之。這恐怕與ASCII或UniCode無關哦! --- 阿道史瓦辛格 Douglas@ndt.iam.ntu.edu.tw ------------------------------------------------------------------------------------------ Date: Mon, 28 Dec 1998 10:15:15 +0800 From: wcc1 To: patch-author@cpatch.org Subject: Re: 00 或 20 該如何抉擇... > 看到 "Detected abbreviation "%s" copied to clipboard." > 翻成 "RoboType 偵測到縮寫字 "%s" 已被複製到剪貼簿. " > ==================================================^^^= > ^^^以 00 00 00 填入。心中不免對自己的小聰明再度佩服一番 > :-) > > 翻完後執行該軟體以便顯示該對話方塊(如下圖二)。咦!有 > 不對勁的地方,原來是 "Type its replacement?" 消失了... > 這下糗了... > > (圖二)中文化後對話方塊 > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ > ▉RoboType > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ > ▉ > ▉RoboType 偵測到縮寫字 "%s" 已被複製到剪貼簿. > ▉參考用,原對話方塊此行為空白行012345678901234567890 > ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ > > 敲敲頭殼...左思右想...一試再試...終於發現那個該死的句點 > (.),也就是未中化前 Hex 值 2E 的位置之前不能補 00。 在上例中並未說明 Detected abbreviation "%s" copied to clipboard. 和 Type its replacement? 原本是同一個字串,只是中間有加換行 字元,還是根本就是兩個獨立的字串.(這得用16進位(HEX)模式比較 容易看出) 光是看程式秀出來字串,這兩種狀態是完全一樣的,但在中文化修改時 就有很大的分別,因為 00(0x0) 在組合語言和 C 語言中都被當作是 字串的結尾,不管原本字串有多長,只要一加入 00,程式在秀此字串時 讀到 00 就會認為字串到此就結束了.所以如果上面的例子如果本是 同一行字串,中間就一定不能插入字元 00;如果是獨立的兩個字串,那 就無妨,因為不管上一個字串被截的多短都不會影響到第二個字串,倒 是第一個字串不能改的太長而覆蓋了第二個字串. 記得以前曾有人列出過一些 C 的輸出控制字元,我再寫一次好了 C 語言制對 16 進制數值的表示法是在數值前面加上 0x,以下就如此 表示: 0 或 0x0 表示字串結尾(NULL) \n NEW LINE,換行(0xa) \r RETURN,跳至行首(0xd) \t TAB(0x9) %d 顯示一個整數,程式執行時會以一個整數取代 %d %s 顯示一個字串. %c 顯示一個字元. %x 顯示一個 16 進制數字.(a-f 小寫) %X 顯示一個 16 進制數字.(A-F 大寫) %f 顯示一個浮點數 %p 顯示位址 這寫只是一些常見的"基本型",還可能會有更複雜的"變化型" 如 %10.2f ,反正把持一個原則,在 VC 和 BC 中看到 % 和 \ 放在字串中時,沒有把握時不要去修改它. 至於用 TRANF,FH,PCTOOLS,UEDIT 之類的軟體去中文化 ASCII 訊息時,風險遠大於用 VC & BC 修改 UniCode,得更小心去 DEBUG. [憧憬] 信箱:wcc@chunyu.com.tw 備用信箱:wcc1@mail2.intellect.com.tw 備用的備用信箱:wcc3@ms7.accmail.com.tw ^_^"