Gemischtes / mishmash

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo Chris
I tryed this already, no effect.

1. Reading the HTML File shared
FileStream := System.IO.FileStream{cFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite}
cBuffer := System.IO.StreamReader{ FileStream}:ReadToEnd()
FileStream:Close ()

2. Some work with the String cBuffer

3. Writing to the Output - and here i have to wrong charset in the output.
bBuffer := System.Text.Encoding.UTF8:GetBytes( cString )
oResponse:ContentLength64 := bBuffer:Length
oOutput := oResponse:OutputStream
oOutput:Write (bBuffer, 0, bBuffer:Length)

In my VO CGI App it was like that - FWrite3(cgi_hStdOut, PTR(_CAST, cString), SLen(cString) )

Horst
User avatar
wriedmann
Posts: 3754
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gemischtes / mishmash

Post by wriedmann »

Hallo Horst,
VO kennt kein Unicode, daher hast Du diese Probleme hier nicht (dafür Einschränkungen bei Zeichensätzen).
Wenn Deine Datei Ansi ist und nicht Unicode, dann solltest Du ein paar Dinge probieren:

Code: Select all

bBuffer := System.Text.Encoding.Default:GetBytes( cString )
auf KEINEN Fall UTF8, denn damit geht Dein Programm davon aus, dass der gelesene String Unicode ist, und das ist er nicht.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo
Hab den Fehler gefunden. Es ist schon beim einlesen falsch. Streamreader haut mir bei den Umlauten schon so einen Mist rein.
Ich weiss aber nun nicht was ich setzen muss, ab dem Property CurrentEncoding werde ich nicht schlau. Und warum macht er das überhaupt ? Gibts da einen globalen Schalter ?

Horst
User avatar
wriedmann
Posts: 3754
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gemischtes / mishmash

Post by wriedmann »

Hallo Horst,
Du kannst schon beim StreamReader das Encoding angeben (wäre ein zweiter Parameter).
Anders als VO arbeitet .NET intern immer mit Unicode. Damit lösen sich jede Menge Probleme mit fremden Zeichensätzen, aber damit ist ein Byte nicht mehr automatisch ein Zeichen.
Der StreamReader kann probieren, das für Dich aufzulösen, das geht aber gerne schief.
Zum Thema Encoding: es gibt da mehrere Klassen im Namespace System.Text:
System.Text.ASCIIEncoding
System.Text.UnicodeEncoding
System.Text.UTF32Encoding
System.Text.UTF7Encoding
System.Text.UTF8Encoding
Wenn Du mit ANSI-Dateien arbeitest, sollte System.Text.Encoding.Default passen:
https://docs.microsoft.com/en-us/dotnet ... ng.default
Das verwendet die für Dein System voreingestellte Codepage.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
FFF
Posts: 1580
Joined: Fri Sep 25, 2015 4:52 pm
Location: Germany

Gemischtes / mishmash

Post by FFF »

Horst,
kannst Du ein kleines Sample bauen? Quelldatei, paar Zeilen, wie Du das liest?
Würde das Helfen erleichtern :)
Regards
Karl
(on Win8.1/64, Xide32 2.20, X#2.20.0.3)
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Das ist es :-)

cBuffer := System.IO.StreamReader{ FileStream,System.Text.Encoding.Default}:ReadToEnd()
Ich habe aber dann GetEncoding (1252) von Chris genommen, traue diesem Default nicht.

Gruss
Horst
Karl-Heinz
Posts: 774
Joined: Wed May 17, 2017 8:50 am
Location: Germany

Gemischtes / mishmash

Post by Karl-Heinz »

Hallo Horst,

Dein Streamreader benötigt das richtige encoding. Die X# Runtime verwendet diese beiden:

Runtimestate.WinEncoding // codepage 1252
Runtimestate.DosEncoding // codepage 850

Da Deine Quelle wahrscheinlich eine Ansi Datei ist sollte das hier passen:

cBuffer := System.IO.StreamReader{ FileStream ,Runtimestate.WinEncoding }:ReadToEnd()

Gruß
Karl-Heinz
FFF
Posts: 1580
Joined: Fri Sep 25, 2015 4:52 pm
Location: Germany

Gemischtes / mishmash

Post by FFF »

Horst wrote:Das ist es :-)
cBuffer := System.IO.StreamReader{ FileStream,System.Text.Encoding.Default}:ReadToEnd()
Nä...
Keine Quelldatei, kein "wie kommt seine Datei in den Filestream"...
Habe eben geschrieben:
USING System.IO
FUNCTION Start( ) AS VOID
VAR fs := File.OpenRead( "D:JMF2020Webhome.html")
VAR cBuffer := System.IO.StreamReader{ fs ,Runtimestate.WinEncoding }:ReadToEnd()
? cBuffer
RETURN

Zeigt die Datei, aber mit Umlautfehlern, was nicht wundert, weil sie so beginnt:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
...

Schreibe ich:
VAR cBuffer := System.IO.StreamReader{ "D:JMFWebhome.html" ,System.Text.Encoding.UTF8}:ReadToEnd()

sind meine Umlaute da.
Regards
Karl
(on Win8.1/64, Xide32 2.20, X#2.20.0.3)
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Hallo FFF
Ich habe alle meine HTMLs mit Charset Windows-1252 definiert. Ich arbeite ja an einem Windwos PC und der WebDesigner schreibt sie Ansi auf die Platte. Ausserdem lese ich DBF Felder und fülle dann das Html. Ist alles Ansi.

Gruss
Horst
User avatar
Horst
Posts: 336
Joined: Tue Oct 13, 2015 3:27 pm

Gemischtes / mishmash

Post by Horst »

Also jetzt bin ich 5 Milimeter vor der Ziellinie ;-) und habe 2 Riesenprobleme. Ich baue ja einen kleinen Webserver mit den XsharpService und dem HttpListener von Wolfgang.
Mein erstes Problem ist, ich kann den Service nicht stoppen. Ich weiss nicht wie man den HttpListerner stoppt. Das Servicemuster alleine von Wolfgang lässt sich starten und stoppen etc. mit dem HttpListerner muss ich jedesmal den Task (XSharpService) abschiessen.
Das zweite Problem. Der HttpListener läuft nicht asynchron. Wenn ich eine lange Pause (for next) einbaue sieht man deutlich das er eins nach dem anderen erledigt. Interessant ist, dass der Timer vom Service aber dazwischen funkt (ins Logfile schreibt) . Ich rufe wahrscheinlich die Routine am falschen Ort auf ??

Gruss und Mahlzeit
Horst
Attachments
XharpServoice.zip
(5.15 KiB) Downloaded 83 times
Post Reply