Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как прочитать файл в Unicode [D6, Win2k]


denis555 ©   (2004-07-29 19:00:00) 

Доброго всем времени суток, есть необходимость открыть текстовый файл сохраненный в Unicode перебоволал массу способов, но русский текст так и остался в краказябликах, IE и блокнот все отображают корректно, как переконвертировать? или открыть сразу в Memo или RichEditе? заранее спасибо.


wnew   (2004-08-07 05:31:00) [1]

Да, если кракозябры так и останутся, такое может быть в Windows с не русскими региональными настройками - то нужно из модуля System скопировать вот эти процедуры и функции:

function WideCharToString(Source: PWideChar): string;
begin
 WideCharToStrVar(Source, Result);
end;

function WideCharLenToString(Source: PWideChar; SourceLen: Integer): string;
begin
 WideCharLenToStrVar(Source, SourceLen, Result);
end;

procedure WideCharToStrVar(Source: PWideChar; var Dest: string);
var
 SourceLen: Integer;
begin
 SourceLen := 0;
 while Source[SourceLen] <> #0 do Inc(SourceLen);
 WideCharLenToStrVar(Source, SourceLen, Dest);
end;

procedure WideCharLenToStrVar(Source: PWideChar; SourceLen: Integer;
 var Dest: string);
var
 DestLen: Integer;
 Buffer: array[0..2047] of Char;
begin
 if SourceLen = 0 then
   Dest := ''
 else
   if SourceLen < SizeOf(Buffer) div 2 then
     SetString(Dest, Buffer, WideCharToMultiByte( 1251, 0,
       Source, SourceLen, Buffer, SizeOf(Buffer), nil, nil))
   else
   begin
     DestLen := WideCharToMultiByte( 1251, 0, Source, SourceLen,
       nil, 0, nil, nil);
     SetString(Dest, nil, DestLen);
     WideCharToMultiByte( 1251, 0, Source, SourceLen, Pointer(Dest),
       DestLen, nil, nil);
   end;
end;


поместить их в свой модуль и первым параметром функции WideCharToMultiByte(( 1251, 0, Source, SourceLen, Pointer(Dest),
       DestLen, nil, nil) передать вместо ноля 1251.


wnew   (2004-08-07 05:21:00) [2]


procedure TForm1.BitBtn1Click(Sender: TObject);
var F:File;
   WideZeichen: array[0..2047] of WideChar;
   FromFile: WideString;
   WCharCount: integer;
   CellsCount: integer;
   ToRichEdit: string;
   AttrUnicode: WideChar;
begin
 if OpenDialog1.Execute then
 begin
   RichEdit1.Clear;
   AssignFile(F,OpenDialog1.FileName);
   Reset(F,SizeOf(WideChar));
   FromFile := '';
   CellsCount := SizeOf(WideZeichen) div SizeOf(WideChar);
   try
     BlockRead(F,AttrUnicode,1,WCharCount);
     if AttrUnicode = #$FEFF then
     begin
       repeat
         FillChar(WideZeichen,SizeOf(WideZeichen),#0);
         BlockRead(F,WideZeichen,CellsCount,WCharCount);
         FromFile := FromFile + WideZeichen;
       until (WCharCount = 0) or (WCharCount < CellsCount);

       ToRichEdit := WideCharToString(PWideChar(FromFile));
       RichEdit1.Lines.Add(ToRichEdit);
     end;
   finally
    CloseFile(F);
   end;
 end;
                         
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо