Re: работа с unicode
От: iac Россия  
Дата: 28.10.05 06:11
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.