0

ルーマニア語のテキストを RichEdit コンポーネント (Delphi 7) に書き込もうとしていますが、フォント プロパティ - Charset を "EASTEUROPE_CHARSET" に設定しても機能しません。

私が達成したいのは、(ルーマニア語で) テキストを RichEdit に貼り付け、StringList にロードし、プロパティの順序を true に設定し、それを別の RichEdit コンポーネントに割り当てることです (リストをアルファベット順に並べ替えます)。

Delphi 2009 以降ではこれが問題にならないことはわかっていますが、現時点では Delphi 7 でしか作業できません。

単語の例:opoziţie、computerizată。

何か案は?

よろしくお願いします、

4

3 に答える 3

3

このコードを試してみてください。RichEdit1 からのテキストを UNICODE テキストとして読み取り、手動で S と T + Comma を S と T + Cedilla に変換してから、WideCharToMultiByte を使用してテキストをコード ページ 1250 に変換します。ページ 1250 は Ş と Ţ のセディラ ベースのバージョンのみをエンコードしますが、Vista と Windows 7 の新しいルーマニア語キーボードは、Ş と Ţ の (正しい) コンマ ベースのバージョンを生成します。

procedure TForm1.Button1Click(Sender: TObject);
var GetTextStruct:GETTEXTEX;
    GetLenStruct:GETTEXTLENGTHEX;
    RequiredBytes:Integer;
    NumberOfWideChars:Integer;
    WideBuff:PWideChar;
    AnsiBuff:PChar;
    i:Integer;
begin
  ;

  // Get length of text
  GetLenStruct.flags := GTL_NUMBYTES or GTL_USECRLF or GTL_PRECISE;
  GetLenStruct.codepage := 1200; // request unicode
  RequiredBytes := SendMessage(RichEdit1.Handle, EM_GETTEXTLENGTHEX, Integer(@GetLenStruct), 0);

  // Prepare structure to get all text
  FillMemory(@GetTextStruct, SizeOf(GetTextStruct), 0);
  GetTextStruct.cb := SizeOf(GetTextStruct);
  GetTextStruct.flags := GT_USECRLF;
  GetTextStruct.codepage := 1200; // request unicode

  WideBuff := GetMemory(RequiredBytes);
  try
    // Do the actual request
    SendMessage(RichEdit1.Handle, EM_GETTEXTEX, Integer(@GetTextStruct), Integer(WideBuff));
    // Replace the "new" diactrics with the old (make Romanian text compatible with code page 1250)
    NumberOfWideChars := RequiredBytes div 2;
    for i:=0 to NumberOfWideChars-1 do
    case Ord(WideBuff[i]) of
      $0218: WideBuff[i] := WideChar($015E);
      $0219: WideBuff[i] := WideChar($015F);
      $021A: WideBuff[i] := WideChar($0162);
      $021B: WideBuff[i] := WideChar($0163);
    end;
    // Convert to code-page 1250
    RequiredBytes := WideCharToMultiByte(1250, 0, WideBuff, -1, nil, 0, nil, nil);
    AnsiBuff := GetMemory(RequiredBytes);
    try
      WideCharToMultiByte(1250, 0, WideBuff, -1, AnsiBuff, RequiredBytes, nil, nil);
      Memo1.Lines.Text := AnsiBuff; // AnsiBuff now contains the CRLF-terminated version of the
                                    // text in RichEdi1, corectly translated to code page 1250
    finally FreeMemory(AnsiBuff);
    end;
  finally FreeMemory(WideBuff);
  end;

end;

次に、似たような方法で AnsiString を UNICODE に変換し、RichEdit にプッシュします。もちろん、唯一の現実的な解決策は、Delphi 2009 または Delphi 2010 に切り替えて、全体で Unicode を使用することです。

于 2010-07-21T07:16:48.220 に答える
3

Jedi の JvWideEditor で解決しました。コードは以下です

procedure TForm2.SortUnicode;
var asrt:TWStringList;
    i:Integer;
begin
 JvWideEditor1.Lines.Clear;
 JvWideEditor2.Lines.Clear;
 asrt:=TWStringList.Create;
 if OpenDialog1.Execute then
  begin
   wPath:=OpenDialog1.FileName;
   JvWideEditor1.Lines.LoadFromFile(wPath,[foUnicodeLB]);
   try
   asrt.AddStrings(JvWideEditor1.Lines);
   for i:=asrt.Count-1 downto 0 do 
    begin
      if Trim(asrt.Strings[i])='' then
       asrt.Delete(i);
    end;
   asrt.Duplicates:=dupAccept;
   asrt.CaseSensitive:=true;
   asrt.Sorted:=True;

   JvWideEditor2.Lines.AddStrings(asrt);
   JvWideEditor2.Lines.SaveToFile(GetCurrentDir+'\res.txt',[foUnicodeLB]);
   finally
    FreeAndNil(asrt);
   end;
  end;
end;
于 2010-07-21T08:02:06.040 に答える
2

Windows の言語設定を確認してください。英語のウィンドウを実行している場合は、「非 Unicode プログラムを次のように扱う...」をルーマニア語に設定してみてください。または、ネイティブのルーマニア語 Windows で実行します。混合環境 (異なる文字セットを同時に表示する必要がある) で実行するには、Unicode が必要になる可能性があります。

于 2010-07-20T11:47:44.473 に答える