Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Unicode открытие файла


Автор: VoAnt 30.11.2005, 11:50
Задача открыть текстовый файл в UTF8.

Ниже приведённый код не работает, почему?

showmassage выводит пустые сообщения....

Код

procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
  SDF : Text; // <----- Думаю что ошибка где-то тут :)
    i :integer; 
  ws: WideString;
  LineDataFileString : array of string;
begin 

assignfile(SDF, 'sd.txt'); 
reset(SDF); 
i := 0; 

while not EOF(SDF) do begin 
SetLength(LineDataFileString, Length(LineDataFileString) + 1); 

readln(SDF, ws); 

LineDataFileString[i] :=  WideCharToString(PWideChar(ws)); 
showmessage(LineDataFileString[i]); 

i := i + 1; 
end; 

closefile(SDF); 
end;

Автор: Alexeis 30.11.2005, 12:00
SDF : Text; не text а TextFile

Автор: VoAnt 30.11.2005, 12:04
Изменил, результат тот же http://forum.chertenok.ru/images/smiles/cray.gif

Код


procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
  SDF : TextFile; // <----- Думаю что ошибка где-то тут :) изменено c Text на TextFile
    i :integer; 
  ws: WideString;
  LineDataFileString : array of string;
begin 

assignfile(SDF, 'sd.txt'); 
reset(SDF); 
i := 0; 

while not EOF(SDF) do begin 
SetLength(LineDataFileString, Length(LineDataFileString) + 1); 

readln(SDF, ws); 

LineDataFileString[i] :=  WideCharToString(PWideChar(ws)); 
showmessage(LineDataFileString[i]); 

i := i + 1; 
end; 

closefile(SDF); 
end;


Автор: Alexeis 30.11.2005, 12:09
readln(SDF, ws);
readln вероятно не преднозначена для WideString

Автор: VoAnt 30.11.2005, 12:13
Хм... А альтернативы есть? Или нужно переписывать код в целом?

Автор: Alexeis 30.11.2005, 12:14
вот пример конветртирования unicode файла при помощи потоков
Код

procedure TForm1.Button3Click(Sender: TObject);
 var
   S1 : WideString;
   s2 : AnsiString;
   I  : Integer;
   
   inpf   : TFileStream;
   outpf  : TFileStream;

   FileSize : Cardinal;

begin
  if opendialog1.Execute
  then
    Begin
      inpf     := TFileStream.Create(opendialog1.FileName, fmOpenRead);
      FileSize := GetFileSize(inpf.Handle ,nil);
      SetLength(S1 ,FileSize div 2);
      inpf.ReadBuffer((@S1[1])^, FileSize);
      inpf.Destroy;

      outpf   := TFileStream.Create(opendialog1.FileName,
                           fmCreate or fmOpenWrite or fmShareDenyNone);

      s2 := WideCharToString(PWideChar(s1));
      i := 1;
      
      While i < Length(s2)
      do
        Begin
          if (s2[i] = #10) and (s2[i - 1] <> #13)
          then
            Insert(#13, s2, i);
          inc(i)
        end;

      Outpf.WriteBuffer((@S2[1])^, FileSize div 2 - 1);
      Outpf.Destroy;
  end;
end;

Автор: VoAnt 30.11.2005, 12:19
Огромное спасибо! Работает !!!!!

Поднял бы Репутацию, но уже 1 ГОД как не могу .. запрещено админом smilesmilesmile .. Забыли наверное убрать бан smile ...

Автор: VoAnt 5.12.2005, 13:56
Так. Продолжаю ТЕму по мере поступления информации smile

Код

...
 var str : string;
...

str := str + 'HI ALL ' + #13#10;
str := str + 'HI NO ALL ' + #13#10;
str := str + 'HI 2 ME' + #13#10;
...



Как содержимое str сохранить в текстовый файл формата UNICODE (CP_UTF8)

Автор: Snowy 5.12.2005, 14:31
Аналогично - переворачивешь все стринки через StringToWideChar и WideChar пишешь в поток.
Поток создавать с флагом fmCreate.

Автор: VoAnt 5.12.2005, 14:40
ws := WideString(StringToWideChar(str,???,???)); <-- недостаточно параметров, что писать нужно?

----
сорьки за ламоцкие вопросы, пытаюсь разобратся полностью

Автор: Snowy 5.12.2005, 15:29
IMHO так:
Код

function StrToWideChar(str: string): WideChar;
var
  p:  PWideChar;
  sz: integer;
begin
  sz:=Length(str) * 2 +1;
  GetMem(p, sz);
  StringToWideChar(str, p, sz);
  result:=p^;
  FreeMem(p);
end;

Автор: VoAnt 5.12.2005, 17:19
Делаю так

Код

...
 var str : string;
       ws : WideString;
...

str := str + 'HI ALL ' + #13#10;
str := str + 'HI NO ALL ' + #13#10;
str := str + 'HI 2 ME' + #13#10;
...

ws := WideString(StrToWideChar(str)); 

Outpf := TFileStream.Create(opendialog1.FileName,fmCreate or fmOpenWrite or fmShareDenyNone);
Outpf.WriteBuffer((@ws)^,length(ws));
Outpf.Destroy;





в файл кидается только первая буква "H"

Где ошибка ? Помогите плз!!

Автор: Snowy 5.12.2005, 17:30
Попробуй заменить в объявлениях WideString и WideChar на string.

Автор: VoAnt 5.12.2005, 18:19
не работает smile

Автор: VoAnt 5.12.2005, 19:58
Решилось!!!

var
S1 : String;
S2 : WideString;

begin

S2 := S1;

end;

Все, автопереформатирование ! smile


Всем спасибо! Тему можно закрывать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)