Installation Xb2.NET als Service, Charset-Problem OEM
Moderator: Moderatoren
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Installation Xb2.NET als Service, Charset-Problem OEM
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
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
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Installation Xb2.NET als Service, Charset-Problem OEM
Moin Lars,
herzlich willkommen hier bei uns.
Wenn Du das als Dienst integrieren willst, hast Du ja sicherlich eine entsprechende Klasse geschrieben:
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:
Dann brauchst Du in der Methode :stop() eigentlich nur alles aufräumen und die Klassenvariable ::lRunning auf .f. setzen.
Viele Grüße,
Martin
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
Code: Alles auswählen
do while ::lRunning
...
AppEvent(...)
...
enddo
Viele Grüße,
Martin
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.
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2945
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Installation Xb2.NET als Service, Charset-Problem OEM
Also ich muss meine Werte mit
konvertieren.
Code: Alles auswählen
ConvToOemCp(cUtf8toAnsi(o:content))
Viele Grüße
Wolfgang
Wolfgang
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
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
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
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
Hallo Wolfgang,
vielen Dank, das werde ich heute ausprobieren.
Viele Grüße
Lars
vielen Dank, das werde ich heute ausprobieren.
Viele Grüße
Lars
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Installation Xb2.NET als Service, Charset-Problem OEM
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:
Firefox in Westlich ISO-8859-15 (bzw. Windows) Zeichenkodierung:
Ich compiliere alle CGI Anwendungen mit ANSI, man kann aber nicht davon ausgehen, dass immer UTF8 vom Browser geliefert wird.
Ä => Ä
Ö => Ö
ä => ä
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
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
Gruß
Hubert
Hubert
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
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 (ü 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
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 (ü 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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Installation Xb2.NET als Service, Charset-Problem OEM
wo hast du denn die Nummern her ?
Nach deiner Beschreibung müsste hier cRet schon einen UTF8 String haben, stimmt das ?
In UTF8 müsste 'ä' doch schon in 2 Zeichen codiert sein (0xC3,0xA4) ...
Nach deiner Beschreibung müsste hier cRet schon einen UTF8 String haben, stimmt das ?
Code: Alles auswählen
cRet := StrTran( cRet,'ä', 'ä')
Gruß
Hubert
Hubert
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
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
richtig, ich konvertiere zuerst mit cAnsiToUTf8 bzw. cOemToUtf8 (wenn aus Tabelle) den String in UTF-8 und dann in die HTML-Codes.
Gruß
Lars
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
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
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
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Installation Xb2.NET als Service, Charset-Problem OEM
Hallo Lars,
Xbase++ kann keine UTF8 Strings verarbeiten, es bearbeitet immer ANSI oder besser gesagt eine Folge von Zeichen.
compilieren mit
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 ) 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 !
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.
Hubert hat geschrieben:Nach deiner Beschreibung müsste hier cRet schon einen UTF8 String haben, stimmt das ?In UTF8 müsste 'ä' doch schon in 2 Zeichen codiert sein (0xC3,0xA4) ...Code: Alles auswählen
cRet := StrTran( cRet,'ä', 'ä')
hier irrst duHubert hat geschrieben: richtig, ich konvertiere zuerst mit cAnsiToUTf8 bzw. cOemToUtf8 (wenn aus Tabelle) den String in UTF-8 und dann in die HTML-Codes.
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")
Code: Alles auswählen
xpp test
alink test /PM:PM
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 ) 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
*-------------------------------------------------------
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
Hubert
-
- Rookie
- Beiträge: 9
- Registriert: Mi, 24. Okt 2012 10:29
Re: Installation Xb2.NET als Service, Charset-Problem OEM
Hallo Hubert,
man lernt nie aus. Vielen Dank für deine Beschreibung.
Gruß
Lars
man lernt nie aus. Vielen Dank für deine Beschreibung.
Gruß
Lars