Avatar billede kennethv Nybegynder
02. april 2007 - 14:33 Der er 1 kommentar og
1 løsning

Indlæs af andet format.

Jeg har på en pc udført denne kommando:
%systemroot%\system32\wbem\wmic.exe /output:c:\%computername%.txt product get name,vendor,version

formatet på denne txtfil er unicode. Hvordan er det muligt at indlæse den slags format?

f.eks.

memo.lines.loadfromfile(filename);

resultatet af indlæsningen er bare en gang vås.
Avatar billede nca Juniormester
02. april 2007 - 16:26 #1
Delpi er ikke særlig glad for UNI-code.
Jeg har på denne adresse
http://groups.google.dk/group/borland.public.delphi.winapi/browse_thread/thread/54c968374f709cf7/8fe74c87f73c5b91?lnk=st&q=read+unicode+file+*delphi*&rnum=8#8fe74c87f73c5b91
fundet nedenstående kode, som virker.


Procedure SwapBytesInWideString( Var ws: WideString );
var
  i: Integer;
begin
  for i:= 1 to Length( ws ) do
    //ws[i] := Swap( ws[i] );
    // if compiler balks at this try
    ws[i] := WideChar( Swap( word( ws[i] )));
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  ws : WideString;
  fs : TFileStream;
begin
  If OpenDialog1.Execute then
  begin
    fs:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
    try
      SetLength( ws, fs.size div 2 );
      fs.ReadBuffer( ws[1], fs.Size );
      If ws[1] = #$FFFE Then
        SwapBytesInWideString( ws );
      If ws[1] = #$FEFF Then
        Delete( ws, 1, 1 );
      RichEdit1.Text:= ws;
    finally
      fs.free
    end;
  end;
end;


Den tilhørende forklaring er:

It is the recommended way to start a unicode text file, and documented in
win32.hlp (topic "Byte-order Mark"). Its purpose is to handle UNICODE files
written on other platforms that use a different byte order (big-endian instead
of the Intel little-endian). If you read the first word of a UNICODE file and
see that it is $FFFE instead of $FEFF you know that you have to swap the bytes
in each word you read to get a valid Widechar for your platform. Delphi has a
Swap function that performs this byte order switch.

So if you read a UNICODE file you have to be prepared to deal with files that
have the correct byte order mark for your platform, that need to be swapped
and those that do not have a byte order mark at all (since it is recommended
but not enforcible, of course).
Avatar billede kennethv Nybegynder
02. april 2007 - 16:40 #2
Ret pudsigt.

Jeg fandt netop noget tilsvarende, som også virker. Du får points alligevel for tiden du brugte. Jeg er sikker på at det du har fundet også virker.

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TStream;
  UnicodeString: WideString;
  UnicodeSign: Word;
  FileName: string;
  FileSize: Cardinal;
begin
  if OpenDialog1.Execute then
  begin
    FileName := 'SchedLgU.Txt';
    F := TFileStream.Create(Opendialog1.FileName, fmOpenRead);
    try
      FileSize := F.Size;
      if FileSize >= SizeOf(UnicodeSign) then
      begin
        F.ReadBuffer(UnicodeSign, SizeOf(UnicodeSign));
        if UnicodeSign = $FEFF then
        begin
          Dec(FileSize, SizeOf(UnicodeSign));
          SetLength(UnicodeString, FileSize div SizeOf(WideChar));
          F.ReadBuffer(UnicodeString[1], FileSize);
          // now UnicodeString contains Unicode string read from stream
          Memo1.Lines.Text := UnicodeString;
        end
        else
          // not a Unicode format;
          Memo1.Lines.LoadFromFile(FileName);
      end;
    finally
      F.Free;
    end;
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester