因為舊系統的緣故,有些使用者的系統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 個部分 這個模型也被稱為馮諾依曼模型...