Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Ansi Encoding ohne Leerzeichen (https://www.delphipraxis.net/193481-ansi-encoding-ohne-leerzeichen.html)

QuickAndDirty 4. Aug 2017 15:59

Ansi Encoding ohne Leerzeichen
 
Hallo
Ich schicke aus einer Delphi APP ein Logfile an Einen Windows Rechner.
Diese Logfile soll in Notepad.exe dargestellt werden.

Delphi-Quellcode:
function TLog.Internal_GetEmailFile: String;
var alogtext:String;
begin
  result := '';
  Internal_ReadFile(alogtext);
  if tFile.Exists(fEmailFile) then
    Tfile.Delete(fEmailFile);
  TFile.WriteAllText(femailfile,UTF8Encode(aLogText), TEncoding.UTF8 );
  result := femailfile;
end;
Wie muss ich das Encoding beim Speichern einstellen damit nicht vor jedem Zeichen ein Leerzeichen steht?

MEissing 4. Aug 2017 16:06

AW: Ansi Encoding ohne Leerzeichen
 
TEncoding.ANSI

(Das war einfach :-))

himitsu 4. Aug 2017 16:22

AW: Ansi Encoding ohne Leerzeichen
 
PS: Das ist kein Leerzeichen, es ist eine 0.

Die 0 vom HighByte des Unicode, wenn da das Char maximal als #255 ist. :zwinker:



Aber wenn die 0 auch bei deinem TEncoding.UTF8 vorhanden war, dann stimmt bei dir noch was Anderes nicht.

QuickAndDirty 4. Aug 2017 16:28

AW: Ansi Encoding ohne Leerzeichen
 
Es war bei Tencoding.Ansi
und bei Tencoding.UTF8 vorhanden :(
WriteAllText Schreibt im UTF 8 fall sogar (laut source) eine BOM davor.

Es ist total seltsam

Uwe Raabe 4. Aug 2017 17:10

AW: Ansi Encoding ohne Leerzeichen
 
Das
Delphi-Quellcode:
Utf8Encode
ist doch völlig überflüssig (wenn nicht sogar schädlich!), denn
Delphi-Quellcode:
WriteAllText
erwartet dort einen
Delphi-Quellcode:
string
und übernimmt selbst das Encoding.

QuickAndDirty 7. Aug 2017 11:17

AW: Ansi Encoding ohne Leerzeichen
 
Ich habe es jetzt umgestellt auf folgendes Verfahren...

Delphi-Quellcode:
function TLog.Internal_GetEmailFile: String;
var alogtext:String;
   AnsiArr:Tbytes;
   UniCodeArr:tBytes;
begin
  result := '';
  Internal_ReadFile(alogtext);
  if tFile.Exists(fEmailFile) then
    Tfile.Delete(fEmailFile);
  unicodeArr := Tencoding.Unicode.GetBytes(aLogtext);
  AnsiArr := TEncoding.Convert(Tencoding.Unicode,Tencoding.ANSI, unicodeArr );
  Tfile.WriteAllBytes(femailfile,AnsiArr);

//  TFile.WriteAllText(femailfile,aLogText, TEncoding.ANSI );

  result := femailfile;
end;
....Notepad.exe gibt mir das mit chinesischen Zeichen wieder :(

Welches ist die native codierung von Strings und Dateien in Delphi Tokyo für Android apps?

Das ist ein Copy&Paste aus dem Ctrl+F7 aud aLogtext
Code:
'4.08.17 17:59:52 EnteredBackground'#012#000'4.08.17 17:59:53 WillBecomeInactive'#012#000'4.08.17 17:59:55 WillBecomeForeground'#012#000'4.08.17 17:59:55 BecameActive'#012#000'4.08.17 17:59:58 WillBecomeInactive'#012#000'4.08.17 18:00:00 EnteredBackground'#012#000'4.08.17 18:00:00 BecameActive'#012#000'4.08.17 18:00:00 WillBecomeInactive'#012#000'4.08.17 18:00:04 WillBecomeForeground'#012#000'4.08.17 18:00:04 BecameActive'#012#000'4.08.17 18:00:09 EnteredBackground'#012#000'4.08.17 18:00:09 WillBecomeInactive'#012#000'4.08.17 18:00:14 WillBecomeForeground'#012#000'4.08.17 18:00:14 BecameActive'#012#000'4.08.17 18:00:48 EnteredBackground'#012#000'4.08.17 18:00:54 WillBecomeInactive'#012#000'4.08.17 18:01:46 Log active'#012#000'4.08.17 18:01:46 App Start'#012#000'4.08.17 18:01:49 FinishedLaunching'#012#000'4.08.17 18:03:42 Log active'#012#000'4.08.17 18:03:42 App Start'#012#000'4.08.17 18:03:53 FinishedLaunching'#012#000'4.08.17 18:06:05 WillBecomeForeground'#012#000'4.08.17 18:06:05 BecameActive'#012#000'4.08.17 18:06:16 EnteredBackground'#012#000'4.08.17 18:06:17 WillBecomeInactive'#012#000'4.08.17 18:06:21 WillBecomeForeground'#012#000'4.08.17 18:06:21 BecameActive'#012#000'4.08.17 18:06:55 EnteredBackground'#012#000'4.08.17 18:07:02 WillBecomeInactive'#012#000'4.08.17 18:07:33 WillBecomeForeground'#012#000'4.08.17 18:07:33 BecameActive'#012#000'4.08.17 18:11:01 EnteredBackground'#012#000'4.08.17 18:11:01 WillBecomeInactive'#012#000'7.08.17 12:18:09 Log active'#012#000'7.08.17 12:18:09 App Start'#012#000'7.08.17 12:18:22 FinishedLaunching'#012#000'7.08.17 12:18:29 WillBecomeForeground'#012#000'7.08.17 12:18:30 BecameActive'#012
Also schon beim Lesen der Datei sind überflüssige #000 drin. Nur am ende ist keines drin. Ich weiß nicht wie die dort rein kommen, bzw wenn sie teil des zeilenumbruchs sind, warum am ende dann keine #000 steht.

QuickAndDirty 7. Aug 2017 12:00

AW: Ansi Encoding ohne Leerzeichen
 
Ok Diese Version funktioniert für Notepad.exe, leider sind dann die Zeilenumbrüche weg.
Sublime Text zeigt dann aber nur eine HExDump an.

Delphi-Quellcode:
function TLog.Internal_GetEmailFile: String;
var alogtext:String;
   AnsiArr:Tbytes;
   UTF8Arr:tBytes;
begin
  result := '';
  Internal_ReadFile(alogtext);
  if tFile.Exists(fEmailFile) then
    Tfile.Delete(fEmailFile);
  UTF8Arr := Tencoding.UTF8.GetBytes(aLogtext);
  AnsiArr := TEncoding.Convert(Tencoding.UTF8,Tencoding.ANSI, UTF8Arr );
  Tfile.WriteAllBytes(femailfile,AnsiArr);

//  TFile.WriteAllText(femailfile,aLogText, TEncoding.ANSI );

  result := femailfile;
end;
Zeilenumbrüche mache ich so mit linefeed...
Delphi-Quellcode:
  aText := Datetimetostr(now) + ' ' + aText + linefeed;
  FStream.Write(aText[1], length(aText) * Sizeof(aText[1]) );

QuickAndDirty 7. Aug 2017 12:34

AW: Ansi Encoding ohne Leerzeichen
 
OK,Das hier ist die Lösung.
Delphi-Quellcode:
function TLog.Internal_GetEmailFile: String;
var alogtext:String;
begin
  result := '';
  Internal_ReadFile(alogtext);
  alogtext := aLogtext.Replace(''+linefeed, ''+carriageReturn+''+linefeed, [rfReplaceAll] );
  alogtext := alogtext.Replace(''#0,'',[rfReplaceAll]);
  if tFile.Exists(fEmailFile) then
    Tfile.Delete(fEmailFile);
  TFile.WriteAllText(femailfile,aLogText, TEncoding.UTF8 );

  result := femailfile;
end;
Ich weiß nicht wie die ganzen "null" werte da rein kommen, aber es fühlt sich so ein bisschen an als würde der Filestream einen Nulltermnierten string schreiben, und auch die #0 in die Datei speichern.

nahpets 7. Aug 2017 13:07

AW: Ansi Encoding ohne Leerzeichen
 
In 'nem FileStream ist alles drin, bei 'nem #0-terminierten String auch die #0, da sie ein Teil von ihm ist.

QuickAndDirty 7. Aug 2017 13:41

AW: Ansi Encoding ohne Leerzeichen
 
Zitat:

Zitat von nahpets (Beitrag 1378258)
In 'nem FileStream ist alles drin, bei 'nem #0-terminierten String auch die #0, da sie ein Teil von ihm ist.

Ist der Datentyp "String" in Firemonkey Anwendungen für Android ein Nullterminierter unicode string?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz