Installation Xb2.NET als Service, Charset-Problem OEM

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Installation Xb2.NET als Service, Charset-Problem OEM

Beitragvon Lars Vogelmann » Mi, 24. Okt 2012 11:29

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
Lars Vogelmann
Rookie
Rookie
 
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

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

Beitragvon Martin Altmann » Mi, 24. Okt 2012 12:27

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 12969
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

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

Beitragvon Wolfgang Ciriack » Mi, 24. Okt 2012 13:34

Also ich muss meine Werte mit
Code: Alles auswählen
ConvToOemCp(cUtf8toAnsi(o:content))

konvertieren.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2235
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin

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

Beitragvon Lars Vogelmann » Do, 25. Okt 2012 8:51

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

Beitragvon Lars Vogelmann » Do, 25. Okt 2012 8:53

Hallo Wolfgang,

vielen Dank, das werde ich heute ausprobieren.

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

Beitragvon brandelh » Do, 25. Okt 2012 9:58

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon Lars Vogelmann » Do, 25. Okt 2012 15:31

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
Lars Vogelmann
Rookie
Rookie
 
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

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

Beitragvon brandelh » Do, 25. Okt 2012 15:51

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon Lars Vogelmann » Fr, 26. Okt 2012 10:44

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

Beitragvon Lars Vogelmann » Fr, 26. Okt 2012 10:54

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
Lars Vogelmann
Rookie
Rookie
 
Beiträge: 9
Registriert: Mi, 24. Okt 2012 10:29

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

Beitragvon brandelh » Fr, 26. Okt 2012 13:05

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13390
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

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

Beitragvon Lars Vogelmann » Mo, 29. Okt 2012 11:08

Hallo Hubert,

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

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


Zurück zu Xb2.Net

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast