Здравствуйте,
Есть файл с текстом в формате юникод, его надо прочесть и преобразовать в win1251. При выполнении кода получается то же самое как и в файле если открыть его в Windows.
Заранее спасибо.
var
fst: TFileStream;
c: widechar;
c2: array [0..255] of char;
sw: array [0..255] of widechar;
s: string;
i: integer;
begin
if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then
try
fst:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
s:=''; i:=0;
while fst.Position<fst.Size do
begin
fst.Read(sw[i],1);
inc(i);
if (i>255) or (i>=fst.Size) then begin
WideCharToMultiByte(CP_ACP,
0,
sw,
-1,
c2,
256,
nil,
nil
);
i:=0;
s:=PCharToString( c2;
end;
end;
Memo1.Lines.Clear;
Memo1.Lines.Add(s);
fst.Free;
except
end;
end;
Здравствуйте, Nimua, Вы писали:
N>Здравствуйте,
N>Есть файл с текстом в формате юникод, его надо прочесть и преобразовать в win1251. При выполнении кода получается то же самое как и в файле если открыть его в Windows.
N>Заранее спасибо.
N>N>var
N> fst: TFileStream;
N> c: widechar;
N> c2: array [0..255] of char;
N> sw: array [0..255] of widechar;
N> s: string;
N> i: integer;
N>begin
N>if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then
N> try
N> fst:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
N> s:=''; i:=0;
N> while fst.Position<fst.Size do
N> begin
N> fst.Read(sw[i],1);
N> inc(i);
N> if (i>255) or (i>=fst.Size) then begin
N> WideCharToMultiByte(CP_ACP,
N> 0,
N> sw,
N> -1,
N> c2,
N> 256,
N> nil,
N> nil
N> );
N> i:=0;
N> s:=PCharToString( c2;
N> end;
N> end;
N> Memo1.Lines.Clear;
N> Memo1.Lines.Add(s);
N> fst.Free;
N> except
N> end;
N>end;
N>
Предпологаю что дело в кододировке файла.
Могу поделится функцией для преобразования. И в твоём случае её надо вызвать ToCode(sw, CP_UTF8, 1251).
function ToCode(strSrc: string; nFromCP, nToCP: LongWord): string;
var
t: string;
begin
Result := '';
setlength(t, MultiByteToWideChar(nFromCP, 0, @strSrc[1], length(strSrc), nil, 0) * SizeOf(WideChar));
MultiByteToWideChar(nFromCP, 0, @strSrc[1], length(strSrc), @t[1], length(t) div 2);
setlength(result, WideCharToMultiByte(nToCP, 0, @t[1], length(t) div 2, nil, 0, nil, nil));
WideCharToMultiByte(nToCP, 0, @t[1], length(t) div 2, @result[1], length(result), nil, nil);
end;