Darstellung einer UTF-8-Mail [Erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Darstellung einer UTF-8-Mail [Erledigt]

Beitrag von Jan »

Moin,

gerade bin ich etwas irritiert. Ich möchte gerne in einem XbpHTMLViewer() Mailtexte anzeigen. Prinzipiell klappt das auch. Aber es gibt, wie kaum anders zu erwarten, Darstellungsfehler. Das hier sind erst einmal die Grundparameter:
Mailformat: UTF-8 (so steht es jedenfalls im Mailheader drin)
Ausgabe: OEM-Oberfläche
Quellcode ANSI, kompiliert mit /ga
Kein SET CHARSET TO ANSI im Code

Was ich mache ist also, das ich in der Mail nachsehe, ob im Header ein "charset=utf-8" drin steht. Wenn ja, dann mache ich ein UTF8ToAnsi() auf den Text. Die Funktion habe ich vor Jahren mal von Günter Beyes bekommen, und setze die andernorts mit Erfolg ein.

Wenn ich das nicht mache, dann werden statt Sonderzeichen wie ß die auf der Spitze stehenden schwarzen Rauten angezeigt. mache ich die Umwandlung, dann stehen da jetzt aber ?. Auch nicht viel schicker.

Dazu kommt folgendes: Da der Mailtext nur mit Verzögerung bereit steht, zeige ich vorher eine hart kodierte Meldung an mit dem Hinweis, das bitte noch ein wenig gewartet werden soll. Diese Meldung beinhaltet ein ß. Nun könnte man meinen, das die korrekt angezeigt wird, überall sonst werden ja auf der Oberfläche auch Umlaute korrekt angezeigt. Nichts da. Angezeigt wird ein á. Und nur, wenn ich das mit ConvToAnsiCP() umwandle, dann erscheint auch das ß.

Wo ist da mein Denkfehler?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Darstellung einer UTF-8-Mail

Beitrag von georg »

Hallo, Jan -


also, ich fange mal mit dem "ß" an. Wenn ich ein kleines Testprogramm habe, das ich mit /ga compiliere, und KEINE Anweisung SET CHARSET TO drin habe, dann wird z.B. in einer ConfirmBox() das "ß" korrekt angezeigt, und ebenso in der Titelleiste des XbpDialog() bei einer Zuweisung dieser Art:

Code: Alles auswählen

oDlg:title := "geht es mit ß?"
Daher ein paar Verständnisfragen:

basiert Dein Programm auf XbpCRT() oder XbpDialog()?
hast Du eine SET CHARSET TO Anweisung im Programm?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Georg,

wie ich oben schon schrieb: OEM-Oberfläche, kein SET CHARSET TO ANSI (und auch sonst kein SET CHARSET).

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Tom »

@Jan: Die "hart codierte" Nachricht - verwendest Du dafür :SetHtml()?
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Darstellung einer UTF-8-Mail

Beitrag von georg »

Hallo, Jan -


leider ist meine zweite Frage noch offen: XbpDialog() oder XbpCRT()?

Das Verhalten Deines Programms in der Anzeige ist - zumindest, wenn ich von XbpDialog() ausgehe - atypisch, daher versuche ich zu verstehen, warum es nicht klappt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Tom,

sowohl die Mails als auch die hart kodierte Nachricht schreibe ich in Array-Felder rein. Und dessen Inhalt wird dann beim Blättern im XbpHtmlViewer()-Fenster angezeigt. Indem die mit :setHtml(aArrayElement) zugewiesen werden.

Bei diesem Zuweisen mache ich noch ein paar Umformatierungen, z. B. mache ich aus crlf in reinen Textmails ein "<br>, weil das dann in HTML korrekt angezeigt wird. Wobei diese reinen Textmails ohne jede Konvertierung der Zeichensätze sauber angezeigt werden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Georg,

wegen einiger grafischer Elemente in der Oberfläche gibt es zu Beginn des Codes ein oXbp := SetAppWindow(). Und oXbp ist der Parent des XbpHtmlViewer(). Das wars dann aber auch schon.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von UliTs »

Und Jan, was für einen Typ hat oXbp?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Uli,

ich versteh Deine Frage nicht. Wie ich schrieb, ist oXbp:= SetAppWindow(). Was sonst kann ich dazu sagen?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Darstellung einer UTF-8-Mail

Beitrag von brandelh »

SetAppWindow() gibt ja das Anwendungsfenster zurück.
Mögliche Typen: XbpDialog, XbpCrt oder ... das beim Consolenfenster (name fällt mir grad nicht ein) oder eine eigena Ableitung davon ...

Jedes verhält sich anders ...

Auch ein Verweis auf OEM stellt das nicht klar, da der Zeichensatz bei allen möglich ist !
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Hubert,

gleich in meinem ersten Beitrag schrieb ich OEM-Oberfläche. Wenn das mal wieder zu unklar gewesen sein soll (wirft man mir ja ganz gerne mal vor): Es ist nichts definiert. Kein XbpCrt, kein XbpDialog, kein irgendwas. Also ganz einfach die normale DOS-Oberfläche die kommt, wenn man nichts einträgt. Da ich aber wie beschrieben einige GUI-Elemente eingebaut habe, die auf einer als OEM estellen Anwendung nicht laufen würden, ist das al GUI=yes kompiliert. Alle Einstellungen in der betreffenden Sektion der xpj lauten:

Code: Alles auswählen

    COMPILE       = xpp
    COMPILE_FLAGS = /ga /b /q
    DEBUG_SAVE    = yes
    GUI           = yes
    LINKER        = alink
    LINK_FLAGS    = /debug
    RC_COMPILE    = arc
    RC_FLAGS      = /v
    OBJ_DIR       = .\Obj
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Darstellung einer UTF-8-Mail

Beitrag von brandelh »

Siehst du JAN, wenn DU nichts machst, außer GUI=YES zu setzen, dann wir automatisch die AppSys.PRG eingebunden und die ruft dann automatisch XbpCrt() auf.
Dies unterscheidet sich in einigen Dingen von einer "richtigen" DOS Oberfläche (richtig ist consolen Anwendung).
OEM ist der Zeichensatz, der auf allen 3 Arten möglich ist.

Code: Alles auswählen

PROCEDURE AppSys()
  ...
  LOCAL oCrt, nAppType := AppType()
  ...
  DO CASE 
    // Anwendung wurde im PM Modus gelinkt, eine XbpCrt Instanz
    // ist zu erzeugen.
    CASE nAppType == APPTYPE_PM
      ...
      // XbpCRT-Fenster erzeugen
      oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
      oCrt:FontWidth  := DEF_FONTWIDTH
      oCrt:FontHeight := DEF_FONTHEIGHT
      oCrt:title      := AppName()
      oCrt:FontName   := "Alaska Crt"
      ...
      SetAppWindow ( oCrt )

    // Anwendung wurde im VIO oder NOVIO Modus gelinkt, eine RootCrt
    // Instanz ist zu erzeugen.
    CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO

      // RootCrt Instanz erzeugen.
      //
      // Die IVar :CreateBuffer bestimmt wie sich das RootCrt verhaelt
      // wenn es in einem Shell Fenster erzeugt wird.
      //
      //   :CreateBuffer == .T. : Das RootCrt wird einen eigenen Bildschirm
      //                          Puffer erzeugen der dann fuer die Darstellung
      //                          verwendet wird. Dies hat zur Folge das 
      //                          Ausgaben mit OutStd() nicht mit anderen
      //                          Text Ausgaben (z.B: Qout(), Dispbox() gemischt
      //                          werden koennen.
      //   :CreateBuffer == .F. : Es wird kein eigener Bildschirm Puffer erzeugt
      //                          und der des Shell Fensters verwendet. OutStd()
      //                          Ausgaben werden nun gleichzeitig dargestellt.
      oCrt := RootCrt():New()
      oCrt:CreateBuffer := .T.
      oCrt:Create()

      // RootCrt wird aktives Fenster und Ausgabeger„t.
      SetAppWindow ( oCrt )

  ENDCASE
RETURN
// EOF
bei RootCrt() hat man in der Anwendung keinen Zugriff auf den verwendeten Zeichensatz, mit XbpCrt() kann man den einstellen.
UTF-8 müsste man eigentlich zuerst in UTF-16 (wide oder unicode) wandeln, dann in ANSI und nun eventuell dann nach OEM.
Möglich dass deine bzw. Alaskas Funktion dfas macht, aber wenn die Anzeige nicht stimmt könnte eine der Konvertierungen fehlen oder zuviel sein.
JAN hat geschrieben:Was ich mache ist also, das ich in der Mail nachsehe, ob im Header ein "charset=utf-8" drin steht.
Wenn ja, dann mache ich ein UTF8ToAnsi() auf den Text.
Die Funktion habe ich vor Jahren mal von Günter Beyes bekommen, und setze die andernorts mit Erfolg ein.
dann müsste der ANSI Text noch nach OEM umgesetzt werden ...

Es ist aber auch gut möglich, dass XbpHTML ... als ActiveX controll nicht sauber die Zeichensätze umsetzt.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Darstellung einer UTF-8-Mail

Beitrag von AUGE_OHR »

Jan hat geschrieben:Ich möchte gerne in einem XbpHTMLViewer() Mailtexte anzeigen.
Interessante Idee.
einen "fertigen" HTML Editor von Diego Kerejeta, mit native Toolbar / Statusbar, findest du in den Sample Toolbar von der DXE LIB
Jan hat geschrieben:Was ich mache ist also, das ich in der Mail nachsehe, ob im Header ein "charset=utf-8" drin steht. Wenn ja, dann mache ich ein UTF8ToAnsi() auf den Text. Die Funktion habe ich vor Jahren mal von Günter Beyes bekommen, und setze die andernorts mit Erfolg ein.
ich habe die Function von Günter Beyes ebenfalls für "UTF-8" Email getestet, welche ich mit Xbsee empfangen hatte, und ähnliche Probleme mit den "Umlauten".
auch Pablos cUTF8ToAnsi() "allein" brachte nicht das gewünschte Ergebnis. ich habe dann von Pablo die AtlEnc.dll*** bekommen um sie richtig zu decodieren.

Code: Alles auswählen

   DO WHILE .T.
      nAnfang := AT("=?UTF-8?B?",cUTF8,nNext)
      IF nAnfang > 0
         nEnde   := AT("?=",cUTF8,nAnfang )
         IF nEnde  > 0
            cMime := SUBSTR(cUTF8,nAnfang,nEnde-nAnfang)
            cMime := STRTRAN(cMime,"=?UTF-8?B?","")
            ? FromBase64(cMime)
            cNext += FromBase64(cMime)
...


FUNCTION FromBase64(cBase64)
LOCAL RETVAR
 // OEM
 RETVAR := cUtf8ToOem(  cBase64Decode(cBase64) )
 // ANSI
*RETVAR := cUtf8ToAnsi( cBase64Decode(cBase64) )

RETURN RETVAR
//
// AtlEnc.DLL Function Base64Decode()
//
FUNCTION cBase64Decode( cSrc )
local nSrcLen := Len( cSrc )
local nDstLen := Base64DecodeGetRequiredLength(nSrcLen)
local cDst    := ChrR(0,nDstLen)
if Base64Decode(cSrc,nSrcLen,@cDst,@nDstLen)
   return Left(cDst,nDstLen)
end
return NIL
*** SEE32 / Subject / UTF-8 ?
public.xbase++.asinet
11. September 2008
gruss by OHR
Jimmy
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: Darstellung einer UTF-8-Mail

Beitrag von brandelh »

denau, die eMail könnte zunächst base64 codiert sein ... also zunächst mit einem UTF-8 fähigen Editor prüfen ob die auch schon UTF-8 ist.

Code: Alles auswählen

FUNCTION FromBase64(cBase64)
LOCAL RETVAR
 // OEM
 RETVAR := cUtf8ToOem(  cBase64Decode(cBase64) )
 // ANSI
*RETVAR := cUtf8ToAnsi( cBase64Decode(cBase64) )

RETURN RETVAR
aber wenn schon, dann den Zeichensatz abfragen und nicht manuell umstellen ,,,

Code: Alles auswählen

*--------------------------------------------------------------------------------
function IsOEM()
return ( set(_SET_CHARSET) = 1 )
*--------------------------------------------------------------------------------
function IsAnsi()
return ( set(_SET_CHARSET) = 0 )
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Darstellung einer UTF-8-Mail

Beitrag von AUGE_OHR »

@Jan
noch was : probiere mal eine Mail mit XbpHTMLViewer() zu erstellen welche äöüÄÖÜß enthält, abspeichern und wieder laden ... mal sehen ob du dann die Umlaute noch hast !!!
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von UliTs »

Hubert,

ich bewundere Deine Geduld mit Jan :!: :)
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Jimmy,

der Pfad zum Download auf Pablos Homepage ist leider nicht mehr gültig (404). Ich hab ihn mal angemailt, ob es die dll noch gibt. Oder ob er das in die ot4xb mit eingebaut hat. Mal schauen, was er dazu sagt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Darstellung einer UTF-8-Mail

Beitrag von brandelh »

Hat nicht Alaska code dazu rausgegeben ?
Ich meine im Büro sowas gespeichert zu haben ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Darstellung einer UTF-8-Mail

Beitrag von AUGE_OHR »

Jan hat geschrieben:der Pfad zum Download auf Pablos Homepage ist leider nicht mehr gültig (404). Ich hab ihn mal angemailt, ob es die dll noch gibt. Oder ob er das in die ot4xb mit eingebaut hat. Mal schauen, was er dazu sagt.
der Verweis geht die Alaska Newsgroup ;)
*** SEE32 / Subject / UTF-8 ?
public.xbase++.asinet
11. September 2008
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Darstellung einer UTF-8-Mail

Beitrag von Jan »

Ich habe von Pablo eine kurze Funktion bekommen, die genau das Richtige macht. Ich brauch dazu nur die normale ot4xb, keine zusätzliche DLL.

Code: Alles auswählen

FUNCTION rfc2047decode(cSrc)

LOCAL cb := 0
LOCAL p := @ot4xb:rfc2047decode(__vstr(cSrc,""), @cb, 0, 0)
LOCAL cc

IF p == 0
   RETURN NIL
ENDIF

cc := PeekStr(p, 0, cb)
_xfree(p)

RETURN TrimZ(cc)
Übergeben werden muß der von UTF8 nach ANSI konvertierte String.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten