比如我有几个文本文件:chi.txt jap.txt rus.txt ,分别有中文\日文和俄文的说明,而我用的是简体中文的XP系统
想在窗体上放三个memo,同时显示这三种不同的文字,但是只有中文是正常,其他都是乱码,指定18030的字库也无法正常显示,请问这种情况如何解决?
delphi 2010

解决方案 »

  1.   

    为了正确显示aisi文本,需要识别Codepage:例如:
    CP1255 1800 SAP Hebrew - ISO8859-8 - Not a complete match 
    CP932 8000 SAP Shift-JIS 
    CP950 8300 SAP Tranditional Chinese 
    CP936 8400 SAP Simplified Chinese 
    CP949 8500 SAP Korean 
    CP874 8600 SAP Thai 经过下面的函数转换就能正常显示了,但是更特殊的字符,例如tm标记,需要Unicode采能支持显示function StringToWideString(const s: AnsiString; codePage: word): WideString;
    var
      l: integer;
    begin
      if s = '' then
        Result := ''
      else begin
        l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil, 0);
        SetLength(Result, l-1);
        if l > 1 then
          MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), -1, PWideChar(@Result[1]), l-1);
      end;
    end;  
      

  2.   

    回1楼
    \\\\\\\\\\\\\\\\\\\\
    你给的函数在delphi 2010下没法编译,我把Pchar改成PAnsiChar后可以编译,但还是没能正常显示,codePage试了几个,如日文932,不知是否是这里出了问题.我百度了一下关于这个CodePage,不是很明白.
      

  3.   

    回3楼
    \\\\\\\\\\\\
    我的TXT是ANSI格式的,我还试过逐个字节读入组成AnsiString,然后用1楼的函数转换,结果还是一样
      

  4.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function StringToWideString(const s: AnsiString; codePage: word): WideString;
    var
      l: integer;
    begin
      if s = '' then
      Result := ''
      else begin
      l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PAnsiChar(@s[1]), -1, nil, 0);
      SetLength(Result, l-1);
      if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PAnsiChar(@s[1]), -1, PWideChar(@Result[1]), l-1);
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    const
    str1 = '俀丏僼傽僀儖峔惉';///
    str2 = '羊囗溧痱磬 镳铞邃箴?钺疣犷蜿?铠栳铌, 耦忪羼蜩爨';
    begin
    memo1.Lines.Add(StringToWideString(str1, 932));
    memo1.Lines.Add(StringToWideString(str2, 1251));
    end;end.
    /// memo1 显示如下:
    /// Memo1
    /// 2.ファイル構成
    /// Стандартная процедур?обработк?ошибок, совместима
      

  5.   

    谢谢frtrnr!
    我调试后发现是我中间转换时出的问题,改正后确实正常了.