Текущий архив: 2004.08.22;
Скачать: 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 вся ветка
Текущий архив: 2004.08.22;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.058 c