delphi 7 richedit和罗马尼亚语

时间:2010-07-20 08:29:25

标签: delphi multilingual richedit

我正在尝试将一些罗马尼亚文本写入RichEdit组件(Delphi 7),甚至我将字体属性 - Charset设置为“EASTEUROPE_CHARSET”它不起作用。

我想要完成的是在RichEdit中粘贴一些文本(罗马尼亚语),加载到StringList中,将属性顺序设置为true并将其分配给另一个RichEdit组件(按字母顺序对列表进行排序)。

我知道这不应该是Delphi2009及以上的问题,但此时我只能使用Delphi 7。

单词示例:opoziţie,computerizată。

有什么想法吗?

致以最诚挚的问候,

3 个答案:

答案 0 :(得分:3)

尝试此代码,它将RichEdit1中的文本作为UNICODE文本读取,手动将S和T +逗号转换为S和T + Cedilla,然后使用WideCharToMultiByte将文本转换为代码页1250.代码点转换需要为完成是因为代码页1250仅对基于cedilla的Ş和versions版本进行编码,而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。

答案 1 :(得分: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;

答案 2 :(得分:2)

检查Windows中的语言设置。如果您正在运行英语窗口,请尝试将“将非unicode程序视为...”设置为罗马尼亚语。或者,在罗马尼亚语原生Windows上运行。要在混合环境中运行(需要同时显示不同的字符集),您可能需要Unicode。