DFM是中文程式如何在英文作業系統不亂碼?

2021-06-16 00:25:30 字數 1547 閱讀 1261

因為舊系統的緣故,有些使用者的系統dfm上設計時全是中文。在使用本多語言元件時,為了偷懶,編輯字典時把原語ddkey用中文來輸入,不按建議的方式用ddmanager來置換為英文。碰到乙個問題,就是程式在英文作業系統下執行,無論如何調整charset,顯示都會是一堆問號。

原因在於:delphi7的classes.pas中的twriter對dfm的string按widestring轉成utf儲存,treader讀取時獲得的是widestring,然後以string賦給元件,如tlale.caption。即dfm本身的儲存是unicode的,這裡不會有問題,但是因為元件本身不是unicode的,在把unicode給ansi是,發生了問題。

ansi直接賦值給unicode時,呼叫了system.pas的_wstrfromlstr,它按作業系統的codepage轉換。在設計時,因為你的作業系統是與你輸入法的codepage一致,所以沒有問題。

unicode直接賦值給ansi時,呼叫了system.pas的_lstrfromwstr,當你的程式在英文作業系統執行時,它實際上把dfm的unicode按英文來轉成了ansi,所以肯定出問題。

要解決這個問題,只有改變treader的行為,即可以改變_lstrfromwstr函式,可以用hook的方法:

procedure mylstrfromwstr(var dest: ansistring; const source: widestring);

begin

dest:=acromultiutils.unicodedecode(source,936);

end;

procedure mylstrfrompwchar(var dest: ansistring; source: pwidechar);

begin

dest:=acromultiutils.unicodedecode(source,936);

end;

function myloadresstring(resstringrec: presstringrec): string;

varws:widestring;

nlen:integer;

begin

if resstringrec = nil then exit;

if resstringrec.identifier < 64*1024 then

begin

setlength(ws,4096);

nlen:=loadstringw(findresourcehinstance(resstringrec.module^),

resstringrec.identifier, pwidechar(ws), length(ws));

setlength(ws,nlen);

endelse

ws:= pwidechar(resstringrec.identifier);

result:=acromultiutils.unicodedecode(ws,936);

result:=acromultiresource.resourcestorage.getdisplayvalue(result);

end;

如何在英文ubuntu下安裝中文輸入法

由於ubuntu的中文介面太 觀了,尤其是終端的字型不好看,還不如看英文的舒服,所以我就想在英文locale下安裝scim,可是按照ubuntu中文wiki上裝老是輸入不了,原來少裝了個東西 sudo apt get install scim scim modules socket scim mod...

中文作業系統如何轉換日期得到英文月分

string kk convert.todatetime 2009 11 10 tostring ddd mmm d 00 00 00 utc 0800 yyyy 得到 二 十一月 10 00 00 00 utc 0800 2009 而我所期望得到的英文的星期簡寫和月分英文的簡寫.比如 thu no...

作業系統 前言02 程式是如何執行

我們先來看一道常規的面試題 相比 32 位,64 位的優勢是什麼?電腦科學方面有兩個巨大的貢獻 圖靈機的內部構造 圖靈機如何執行程式 運算流程是 圖靈機構造的這一台機器,主要功能就是讀寫紙帶然後計算 紙帶中有資料 也有控制字元 也就是指令 計算機結構分成以下 5 個部分 這個模型也被稱為馮諾依曼模型...