![]() |
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:
Wie muss ich das Encoding beim Speichern einstellen damit nicht vor jedem Zeichen ein Leerzeichen steht?
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; |
AW: Ansi Encoding ohne Leerzeichen
TEncoding.ANSI
(Das war einfach :-)) |
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. |
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 |
AW: Ansi Encoding ohne Leerzeichen
Das
Delphi-Quellcode:
ist doch völlig überflüssig (wenn nicht sogar schädlich!), denn
Utf8Encode
Delphi-Quellcode:
erwartet dort einen
WriteAllText
Delphi-Quellcode:
und übernimmt selbst das Encoding.
string
|
AW: Ansi Encoding ohne Leerzeichen
Ich habe es jetzt umgestellt auf folgendes Verfahren...
Delphi-Quellcode:
....Notepad.exe gibt mir das mit chinesischen Zeichen wieder :(
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; 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:
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.
'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
|
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:
Zeilenumbrüche mache ich so mit linefeed...
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;
Delphi-Quellcode:
aText := Datetimetostr(now) + ' ' + aText + linefeed;
FStream.Write(aText[1], length(aText) * Sizeof(aText[1]) ); |
AW: Ansi Encoding ohne Leerzeichen
OK,Das hier ist die Lösung.
Delphi-Quellcode:
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.
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; |
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.
|
AW: Ansi Encoding ohne Leerzeichen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz