Вниз
Скачать: CL | DM;

Как прочитать файл в Unicode   Найти похожие ветки 

← →
denis555   (2004-07-29 19:00) [0]

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


← →
wnew ©   (2004-08-07 05:21) [1]


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;


← →
wnew ©   (2004-08-07 05:31) [2]

Да, если кракозябры так и останутся, такое может быть в 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.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.02 c
1-1092028242
Shadow[AN]
2004-08-09 09:10
2004.08.22
Динамическое создание компонентов


3-1090953886
sloug
2004-07-27 22:44
2004.08.22
Нужно посчитать


14-1091365571
VipeR
2004-08-01 17:06
2004.08.22
Рисование Canvas


3-1090831399
Вовчик
2004-07-26 12:43
2004.08.22
Удаление


14-1091642162
SyncMaster
2004-08-04 21:56
2004.08.22
аля WinHEX




   Наверх