Installation Xb2.NET als Service, Charset-Problem OEM

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Antworten
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo,

ich möchte mich kurz vorstellen. Mein Name ist Lars Vogelmann und ich programmiere seit ca. 13 Jahren Clipper und XBase++ sowie seit ca. 2 Jahren PHP und seit kurzem ein wenig JQuery.

Hier zu meinem Problem:

1) Ich bin gerade dabei, eine umfangreiche Web-Anwendung in Xb2.NET zu entwickeln. Wenn ich diese als Service auf einem Windows Server 2008 R2 installiere, bekomme ich beim Beenden des Services die Fehlermeldung "Der Dienst konnte nicht beendet werden, Fehler 109: Pipe wurde beendet". Danach ist der Service zwar beendet, aber die Fehlermeldung ist lästig.

2) Ich habe eine Tabelle im OEM-Format, in der ich eine Volltextsuche ausführe. Sobald ich aber Suchbegiffe mit Umlauten, z.B. "Rucksäcke" habe, werden diese nicht mehr gefunden. Ich habe schon Konvertierungen über ConvToOemCP, cUtf8toOEM etc. versucht, alles ohne Erfolg.

3) Dasselbe Problem habe ich, wenn ich eine Autocomplete-Funktion mit den Suchbegriffen fülle, sobald Umlaute im Spiel sind, werden diese nicht richtig dargestellt (aus "Rucksäcke" wird "Ruckszcke" etc.). Eine Testanzeige in der Xb2.NET-Konsole zeigt mit an, das der Begriff bereits so aus der Tabelle ausgelesen wird. Konvertierungsversuche waren auch hier ohne Erfolg.

Ich habe die Datenbankverbindung von FOXDBE auf ADSDBE umgestellt, hat mir nur mit meinem Charset-Problem nicht weitergeholfen. ADS-Version ist die 11.0.

Die verwendete XBase++ Version ist die 1.90.355, die Xb2.NET Version ist die 3.2.17.

Wenn mir einer damit weiterhelfen könnte, wäre ich echt dankbar.

Gruß
Lars
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Martin Altmann »

Moin Lars,
herzlich willkommen hier bei uns.
Wenn Du das als Dienst integrieren willst, hast Du ja sicherlich eine entsprechende Klasse geschrieben:

Code: Alles auswählen

CLASS MyService From ServiceApp 
  EXPORTED: 
    CLASS METHOD main 
    CLASS METHOD stop 
  HIDDEN: 
    CLASS VAR lRunning 
ENDCLASS
In der Methode :main() startest Du im Prinzip Deinen Server und setzt die Klassenvariable ::lRunning auf .t.. Und der Eventhandler läuft in einer Art Endlosschleife:

Code: Alles auswählen

do while ::lRunning
...
AppEvent(...)
...
enddo
Dann brauchst Du in der Methode :stop() eigentlich nur alles aufräumen und die Klassenvariable ::lRunning auf .f. setzen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Wolfgang Ciriack »

Also ich muss meine Werte mit

Code: Alles auswählen

ConvToOemCp(cUtf8toAnsi(o:content))
konvertieren.
Viele Grüße
Wolfgang
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo Martin,

vielen Dank. Ich habe mich bei der Erstellung an den Beispiel-Prg's von Boris orientiert und die in den meisten Teilen übernommen.

Viele Grüße
Lars
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo Wolfgang,

vielen Dank, das werde ich heute ausprobieren.

Viele Grüße
Lars
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von brandelh »

Für Webseiten die ich anzeige (also meine CGI Programme erstellen) nutze ich eine Umsetzung von Umlauten in HTML chars:
Ä => Ä
Ö => Ö
ä => ä
etc.

Wenn ich nun in eines meiner HTML Formulare Text eingebe und unter Ansicht wurde UTF8 eingetragen,
kommen andere Zeichen beim Server an als wenn ich Westlich 1252 etc. verwende:

Eingabe in Felder:
name: äöü
email: ÄÖÜß

Firefox in UTF8 Zeichenkodierung:

Code: Alles auswählen

STDIN:
name=%C3%A4%C3%B6%C3%BC&email=%C3%84%C3%96%C3%9C%C3%9F
STDIN-Original:
name=%C3%A4%C3%B6%C3%BC&email=%C3%84%C3%96%C3%9C%C3%9F 
Firefox in Westlich ISO-8859-15 (bzw. Windows) Zeichenkodierung:

Code: Alles auswählen

STDIN:
name=%E4%F6%FC&email=%C4%D6%DC%DF
STDIN-Original:
name=%E4%F6%FC&email=%C4%D6%DC%DF 
Ich compiliere alle CGI Anwendungen mit ANSI, man kann aber nicht davon ausgehen, dass immer UTF8 vom Browser geliefert wird.
Gruß
Hubert
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo Hubert,

da habe ich etwas ähnliches. Da ich HTML 5 verwende und als Charset UTF-8, konvertiere ich Strings zuerst mit cAnsiToUtf8 bzw. cOemToUtf8 und dann mit einer eigenen Funktion in Html-Nummern um. Die HTML-Entities (&uuml etc.) können unter älteren Browsern nämlich nicht richtig dargestellt werden, die Html-Nummern sind da besser. Entities sind eigentlich eine XHMTL-Geschichte, nicht HTML 5.

Dann sind das nämlich so aus:

cRet := StrTran( cRet,'ä', 'ä')
cRet := StrTran( cRet,'ö', 'ö')
cRet := StrTran( cRet,'ü', 'ü')
cRet := StrTran( cRet,'ß', 'ß')
cRet := StrTran( cRet,'€', '€')

etc.

Gruß
Lars
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von brandelh »

wo hast du denn die Nummern her ?

Nach deiner Beschreibung müsste hier cRet schon einen UTF8 String haben, stimmt das ?

Code: Alles auswählen

cRet := StrTran( cRet,'ä', 'ä')
In UTF8 müsste 'ä' doch schon in 2 Zeichen codiert sein (0xC3,0xA4) ...
Gruß
Hubert
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo Hubert,

richtig, ich konvertiere zuerst mit cAnsiToUTf8 bzw. cOemToUtf8 (wenn aus Tabelle) den String in UTF-8 und dann in die HTML-Codes.

Gruß
Lars
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Falls noch einer Schwierigkeiten mit UTF-8 Kodierung in seinen HTML-, JS- und CSS-Dateien hat, hab ich hier einen gute Lösung dafür gefunden:

http://www.ajax-community.de/sonstige-p ... nsatz.html

Für meine PRG's geht das leider nicht, da diese ANSI-kodiert sind, aber da muß man dann Ausgabestring einfach per cAnsiToUtf8 konvertieren.

Gruß
Lars
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von brandelh »

Hallo Lars,
Hubert hat geschrieben:Nach deiner Beschreibung müsste hier cRet schon einen UTF8 String haben, stimmt das ?

Code: Alles auswählen

cRet := StrTran( cRet,'ä', 'ä')
In UTF8 müsste 'ä' doch schon in 2 Zeichen codiert sein (0xC3,0xA4) ...
Hubert hat geschrieben: richtig, ich konvertiere zuerst mit cAnsiToUTf8 bzw. cOemToUtf8 (wenn aus Tabelle) den String in UTF-8 und dann in die HTML-Codes.
hier irrst du :!:

Xbase++ kann keine UTF8 Strings verarbeiten, es bearbeitet immer ANSI oder besser gesagt eine Folge von Zeichen.

Code: Alles auswählen

#include "ot4xb.ch"

procedure main
   local cRet                // hier noch OEM !
   msgbox( "IsAnsiCP ? "+JaNein(IsAnsiCP()),"vor set charset" )
   set charset to ansi       // jetzt ANSI
   msgbox( "IsAnsiCP ? "+JaNein(IsAnsiCP()),"nach set charset" )
   cRet := "ändere"          // Ansi
   msgbox( cRet+" => "+ZeigBytes(cRet) +chr(13) +;
           "Ist 'ä' in cRet ? "+JaNein("ä" $ cRet),"Alles ANSI" )
   cRet := cAnsiToUTf8(cRet) // IM SPEICHER UTF-8 Text IN ANSI VARIABLE!
   msgbox( cRet+" => "+ZeigBytes(cRet) +chr(13) +;
           "Ist 'ä' in cRet ? "+JaNein("ä" $ cRet) +chr(13) +;
           "asc('ä') = "+str(asc('ä')),"Nun cRet Inhalt in UTF-8" )
return
*-------------------------------------------------------
function zeigBytes(cTxt)
   local i,cRet := ""
   if ValType(cTxt)="C"
      for i := 1 to len(cTxt)
          cRet += str(asc(cTxt[i]),4)
      next
   endif
return cRet
*-------------------------------------------------------
function IsAnsiCP()
return set(_SET_CHARSET)=0      // 0 = Ansi, 1 = OEM
*-------------------------------------------------------
function JaNein(lWert)
return iif(lWert,"JA","NEIN")
compilieren mit

Code: Alles auswählen

xpp test
alink test /PM:PM
Der Inhalt von cRet wird zwar von "ändere" (Ansi) nach "ändere" (UTF-8) umgewandelt, aber Xbase++ kann nur ANSI bearbeiten.
Daher wird "ä" $ cRet .f. zurückgeben, denn "ä" $ "ändere" gibt .f. zurück :!:

cRet := StrTran( cRet,'ä', 'ä') sucht also nicht nach dem Buchstaben "ä", sondern bestenfalls nach chr(228), was zufällig enthalten sein könnte,
aber keinem Buchstaben "ä" in UTF-8 entspricht.

Eigentlich müsste diese Umwandlung aber auch unnötig sein, denn nach der Ansi 2 UTF-8 Umsetzung müssten die Umlaute immer stimmen,
wenn man den Zeichensatz mit der zutreffenden Codepageinfo ausstattet. Bei mir:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> / bei dir halt UTF-8
Aktuelle Browser (andere unterstütze ich grundsätzlich nicht :badgrin: ) kommen damit immer zurecht,
egal ob im Browser UTF-8, Westlich 1252 oder ISO-8859-1 / 15 eingestellt ist.

Dein Problem ist aber der rückläufige Weg. Hier musst du zunächst ermitteln, ob du UTF8 oder ANSI bekommst,
das hängt nämlich von der Browsereinstellung ab (soweit ich das bei meinem Programm nachstellen kann).

Dann musst du ermitteln (wissen ?) welchen CHARSET deine EXE hat, ich nutze hier immer ANSI für WEB Programme.
Eine Funktion ist aber flexibler !

Code: Alles auswählen

*-------------------------------------------------------
function IsAnsiCP()
return set(_SET_CHARSET)=0      // 0 = Ansi, 1 = OEM
*-------------------------------------------------------
Weiterhin muss man prüfen, ob eine automatische ANSI / OEM Konvertierung stattfindet !
Das habe ich noch nicht probiert, aber nach der Hilfeseite "SET CHARSET - Standard Zeichensatz einstellen" müsste es so sein.
Abhängig von deiner EXE, müsstest du immer nach ANSI oder OEM convertieren und Xbase++ erledigt den Rest.

EXE-OEM == DBFNTX-OEM ... cUtf8ToOEM()
EXE-OEM => FOXCDX-ANSI ... cUtf8ToOEM() - beim Speichern wird automatisch gewandelt.

EXE-ANSI => DBFNTX-OEM ... cUtf8ToAnsi() - beim Speichern wird automatisch gewandelt.
EXE-ANSI == FOXCDX-ANSI ... cUtf8ToAnsi()

ADS :?: :?: :?: :?: :?:

und immer daran denken, UTF-8 ist für Xbase++ nur eine Kette von Zeichen, sobald chr(127) überschritten wird.
Gruß
Hubert
Lars Vogelmann
Rookie
Rookie
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

Re: Installation Xb2.NET als Service, Charset-Problem OEM

Beitrag von Lars Vogelmann »

Hallo Hubert,

man lernt nie aus. Vielen Dank für deine Beschreibung.

Gruß
Lars
Antworten