Announcement

Collapse
No announcement yet.

Webservice und Umlaute

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Webservice und Umlaute

    Hallo,
    ich habe mit Delphi 8 eine Webservice geschrieben, der Werte in eine Datenbank schreibt. Die Werte werden in einem Record mit mehreren Feldern (strings und integer) übergeben. Der Webservice schreibt diese Werte dann in den SQl-Server. Es funktioniert alles gut bis auf die Tatsache, dass ich alle Umlaut nur als ??? in die Datenbank bekomme. Was mache ich falsch? Ich verwende überigens Delphi 7 um den Webservice aufzurufen.

    Danke

    Thomas

  • #2
    Laufen alle Systemteile (Client + Server) auf der gleichen Default-Codepage (Deutsch/Westeuropäisch). D7 ist nur bedingt Unicodefähig und damit kann auf dem Weg D8 -> SOAP -> D7 -> SOAP -> D8 können diverse Codepage-Wandlungen auftreten, welche die Umlaute "zerstören" Ich würde nach empfang der Webservice-Daten in D8 eine Log-Ausgabe durchführen, ob hier noch die Daten passen.

    Auch sollten alle Text-Spalten in der Datenbank vom Typ <b>n</b>varchar sein, damit auch hier keine Probleme zu erwarten sind

    Comment


    • #3
      Hallo,

      ich denke genau daran liegt es. Ich finde es aber nicht heraus wie ich es ändern kan. Wie kann ich den gesammten Record mit Delphi 7 als uft-8 losschicken? Wenn ich eine Winform Anwendung mit Delphi 8 mache funktioniert es. Ich habe aber Kunden ohne .net Framework!

      Danke für eure Hilfe

      Thomas Dallmeie

      Comment


      • #4
        Wie schaut deine SOAP-Schnittstelle aus. Wie die von Delphi generierte Interface-Datei?

        Normalerweise sollte ja im WSDL der SOAP-Schnittstelle stehen, wie die Daten codiert werden sollen

        Comment


        • #5
          Hallo,

          bei der Generierung des Webservice in Delphi 8 habe ich nur Standard einstellungen verwendet. Was brauchts du für Infos über die SOAP-Schnittstelle bzw. wo finde ich diese?

          Die Interface Datei von delphi 7 schaut so aus:
          <pre>
          / ************************************************** ********************** //
          // Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus
          // unten beschriebener WSDL-Datei stammen:
          // WSDL : http://xxxxxxxx
          // Codierung : utf-8
          // Codegen : [wfDebug,wfUseSerializerClassForAttrs]
          // Version : 1.0
          // (20.08.2004 13:05:48 - 1.33.2.5)
          // ************************************************** ********************** //

          unit uwsPED40;

          interface

          uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

          type

          // ************************************************** ********************** //
          // Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
          // nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
          // aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
          // sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
          // für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
          // ************************************************** ********************** //
          // !:string - "http://www.w3.org/2001/XMLSchema"
          // !:int - "http://www.w3.org/2001/XMLSchema"

          TNutzerRec = class; { "http://xxxx" }
          getAllUserResult = class; { "http://xxxx" }

          // ************************************************** ********************** //
          // Namespace : http://xxxx
          // ************************************************** ********************** //
          TNutzerRec = class(TRemotable)
          private
          FID: Integer;
          FCDROM_ID: Integer;
          FLogin: WideString;
          FPassword: WideString;
          FName: WideString;
          FNachname: WideString;
          FFirma1: WideString;
          FFirma2: WideString;
          FAnschrift: WideString;
          FPLZ: WideString;
          FOrt: WideString;
          FLand: WideString;
          FEMail: WideString;
          Fwww: WideString;
          FAnrede: WideString;
          Fnewsletter: Integer;
          Fgetupdate: Integer;
          published
          property ID: Integer read FID write FID;
          property CDROM_ID: Integer read FCDROM_ID write FCDROM_ID;
          property Login: WideString read FLogin write FLogin;
          property Password: WideString read FPassword write FPassword;
          property Name: WideString read FName write FName;
          property Nachname: WideString read FNachname write FNachname;
          property Firma1: WideString read FFirma1 write FFirma1;
          property Firma2: WideString read FFirma2 write FFirma2;
          property Anschrift: WideString read FAnschrift write FAnschrift;
          property PLZ: WideString read FPLZ write FPLZ;
          property Ort: WideString read FOrt write FOrt;
          property Land: WideString read FLand write FLand;
          property EMail: WideString read FEMail write FEMail;
          property www: WideString read Fwww write Fwww;
          property Anrede: WideString read FAnrede write FAnrede;
          property newsletter: Integer read Fnewsletter write Fnewsletter;
          property getupdate: Integer read Fgetupdate write Fgetupdate;
          end;

          // ************************************************** ********************** //
          // Namespace : http://xxxxx // ************************************************** ********************** //
          getAllUserResult = class(TRemotable)
          private
          Fschema: WideString;
          published
          property schema: WideString read Fschema write Fschema;
          end;

          // ************************************************** ********************** //
          // Namespace : http://xxxxxx
          // soapAction: http://xxxxxx/%operationName%
          // Transport : http://schemas.xmlsoap.org/soap/http
          // Stil : document
          // Bindung : TwsPED40Soap
          // Service : TwsPED40
          // Port : TwsPED40Soap
          // URL : http://xxxxxx.asmx
          // ************************************************** ********************** //
          TwsPED40Soap = interface(IInvokable)
          ['{D1831168-EE45-8C3B-B498-EAAD93A09CB3}']
          function About(const s: WideString): WideString; stdcall;
          function insertNewUser(const N: TNutzerRec): Integer; stdcall;
          function getAllUser(const pwd: WideString; const login: WideString): getAllUserResult; stdcall;
          function updateUser(const pwd: WideString; const login: WideString; const N: TNutzerRec): Integer; stdcall;
          function getUser(const pwd: WideString; const login: WideString; const N: TNutzerRec): Integer; stdcall;
          end;

          function GetTwsPED40Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): TwsPED40Soap;

          <pre>
          -----------------------------------------
          Dank

          Comment


          • #6
            Hallo,

            dieser Effekt tritt nur in der Richtung Delphi 7 --> .NET, aber nicht in der Gegenrichtung auf, wie das folgende Minimal-Beispiel demonstriert:

            a) C# ASP.NET XML Web Service
            <pre>
            [WebMethod]
            <b>public</b> <b>string</b> InsertNewRecord2(<b>string</b> sWert)
            {
            <b>return</b> sWert + <font color="#9933CC">&quot; äöüß&quot;</font>;
            }
            </pre>
            b) Delphi 7-Client
            <pre>
            Service1Soap = <b>interface</b>(IInvokable)
            [<font color="#9933CC">'{CFE467D4-A39E-2BD2-5836-7685A9E27F8D}'</font>]
            <b>function</b> InsertNewRecord(<b>const</b> sWert: WideString): WideString; <b>stdcall</b>;
            <b>function</b> InsertNewRecord2(<b>const</b> sWert: WideString): WideString; <b>stdcall</b>;
            <b>end</b>;
            </pre>
            ...
            <pre>
            <b>procedure</b> TForm1.Button2Click(Sender: TObject);
            <b>var</b>
            aSrv : Service1Soap;
            sWert: WideString;
            sRes : WideString;
            <b>begin</b>
            aSrv := GetService1Soap;
            sWert := <font color="#9933CC">'Umlaute äöüß - Rückweg: '</font>;
            sRes := aSrv.InsertNewRecord2(sWert);
            ShowMessage(sRes);
            <b>end</b>;
            </pre>
            c) Ergebnis: Siehe Abbildung (die in C# als String abgelegten Umlaute landen korrekt im Delphi 7-Client). Da auch Delphi 8 an einigen Stelle massive Probleme mit dem <i>UTF lead byte</i> (3F alias ?) hat, gehe ich von einem handfesten Delphi 7-Bug aus

            Comment


            • #7
              Hallo,
              stimmt, ich bin auch gerade soweit, indem ich einige Strings hin und her geschickt habe. Können Sie sich ein Workaraund vorstellen?

              Danke
              Thoma

              Comment


              • #8
                Hallo,

                &gt;.. Workaround

                nun - man darf keine Zeichen oberhalb von ASCII 127 verwenden :-

                Comment


                • #9
                  Man hätte in der Rechtschreibreform die Umlaute streichen sollen!
                  Aber im Ernst gibt es noch eine andere Möglichkeit den WS aufzurufen

                  Comment


                  • #10
                    Da ja viele Units im Bezug auf SOAP als Pascal-Datei vorliegen, sollte es möglich sein die Fehler in der Implementierung zu finden (Compilierung mit Debug-DCU's)

                    Comment


                    • #11
                      Hallo,

                      ich habe die Lösung in einer englischen Newsgroup erhalten:

                      You have to set THTTPRIO.HTTPWebNode.UseUTF8InHeader to True as well.

                      Here is my code:

                      procedure TForm1.Button1Click(Sender: TObject);
                      var
                      WS: TwsDataVinoSoap;
                      S: WideString;
                      begin
                      WS := GetTwsDataVinoSoap(False, '', HTTPRIO1);
                      S := WS.About('Teststring with äöüÄÖÜ');
                      ShowMessage(S);
                      end;

                      DFM for THTTPRIO component:

                      object HTTPRIO1: THTTPRIO
                      HTTPWebNode.Agent = 'Borland SOAP 1.2'
                      HTTPWebNode.UseUTF8InHeader = True
                      HTTPWebNode.InvokeOptions = [soIgnoreInvalidCerts,
                      soAutoCheckAccessPointViaUDDI]
                      Converter.Options = [soSendMultiRefObj, soTryAllSchema,
                      soRootRefNodesToBody, soUTF8InHeader, soCacheMimeResponse, soUTF8EncodeXML]
                      Left = 48
                      Top = 32
                      en

                      Comment

                      Working...
                      X