首页  编辑  

英文系统的乱码及问号问题

Tags: /超级猛料/IME.Charset.输入法和中文处理/   Date Created:

英文系统的乱码及问号问题

delphi7 编译出来的程序在英文xp下中文显示BUG

我用delphi7编译出来的程序在英文xp下中文全都显示为??

用delphi6编译出来的就不会,真奇怪。。。。

解答(acheng):

是delphi7的Bug

http://qc.borland.com/wc/qcmain.aspx?d=2460

解决:  

uses Windows;

 Application.Initialize;

//  设置本程序的区域语言

 SetThreadLocale(DWORD(Word(SORT_DEFAULT) shl 16) or

                 DWORD(Word(SUBLANG_CHINESE_SIMPLIFIED) shl 10) or

                 DWORD(Word(LANG_CHINESE)));

在英文系统中,往往会遇到乱码及问号问题

一.显示乱码时:

一种是没字库,

如:刚装完的英文系统,没装上中文的语言支持时,就会这样.

一种是有语言支持,但Language for non-Unicode不对(控制面板里的语言的高级里面的Language for non-Unicode),

如:你当前设成简体的,要运行繁体的程序时候的乱码(如:明星三缺一).

解决:

1.把系统默认的改掉.

2.内码转换:如《Microsoft Applocale》

http://d7.games.sina.com.cn/tools_1024/Applocale_tools_03_10_03.zip

二.当显示为问号时,且Language for non-Unicode是对的.

这时就是程序的问题:

比如:delphi7在中文系统编译出来的在英文系统就会显示?号.(delphi6 不会)

解决:在程序代码中加上

 SetThreadLocale($0804);//$0804 为简体的codepage ,$0404://tranditional chinese:

对于不能重编译的程序,只能对其注入打补丁.

参数这篇VC的代码

http://www.cnblogs.com/hBifTs/articles/4521.html ,我转成DELPHI的

http://agu.datas.googlepages.com/LocalePatch.rar ,方便我自己做补丁程序.

使用了QueueUserAPC,直接用CreateRemoteThread好像不行,原因不知,哪个高手告知下.

delphi代码如下:

type

 apc=packed record locale:LCID;p: function (Locale: LCID): BOOL; stdcall;end;pApc=^apc;

 procedure RemoteFun(_ap:pApc);stdcall; begin _ap^.p(_ap^.locale); end;

 procedure FunAfter ; begin end;

 procedure SetLocale(aProcess,aThread,aLocale:Cardinal);

 var  vCodeSeg,vDataSeg:Pointer; vAp:apc;lpNumberOfBytesWritten: DWORD;

 begin

   vCodeSeg := pDWORD(VirtualAllocEx(aProcess,nil,Integer(@FunAfter)-Integer(@RemoteFun),MEM_COMMIT, PAGE_EXECUTE_READWRITE ));

   vDataSeg :=pApc(VirtualAllocEx(aProcess,nil,SizeOf(vAp),MEM_COMMIT, PAGE_READWRITE ));

   with vAp do begin locale :=aLocale;@p:=GetProcAddress(GetModuleHandle('kernel32'),'SetThreadLocale'); end;

   WriteProcessMemory(aProcess,vCodeSeg,@RemoteFun,Integer(@FunAfter)-Integer(@RemoteFun),lpNumberOfBytesWritten);

   WriteProcessMemory(aProcess,vDataSeg,@vAp,SizeOf(vAp),lpNumberOfBytesWritten);

   QueueUserAPC(vCodeSeg,aThread,DWORD(vDataSeg));

 end;

procedure PatchFile(aFilename:String;aLocale:Cardinal=$0804);

 var

   vStartupInfo:TStartupInfo;

   vProcessInfo:TProcessInformation;

   vDir:string;

 begin

   FillChar(vStartupInfo,SizeOf(vStartupInfo),#0);

   vStartupInfo.cb:=SizeOf(vStartupInfo);

   vStartupInfo.dwFlags:=STARTF_USESHOWWINDOW;

   vStartupInfo.wShowWindow:=SW_SHOWNORMAL;

   vDir:=ExtractFilePath(aFileName);

   if DirectoryExists(vDir) then  ChDir(ExtractFilePath(aFileName));

   if CreateProcess(nil,PChar(aFilename),nil,nil,False,CREATE_SUSPENDED,nil,nil,vStartupInfo,vProcessInfo) then

   begin

     SetLocale(vProcessInfo.hProcess,vProcessInfo.hThread,aLocale);

     ResumeThread(vProcessInfo.hThread);

     CloseHandle(vProcessInfo.hThread);

     CloseHandle(vProcessInfo.hProcess);

   end;

 end;

这个补丁程序能解决的我机子的问题:

1.VM的绿色汉化版(显示?)

2.MiniCD(显示?)

3.delphi imageen 在英文系统的乱码

4.delphi7在英文系统不能用中文输入法录入中文,只能COPY,PASTE来录入中文

5.以前在Delphi7写的程序

6.其它部分小工具的(?号)