XML und Sonderzeichen in C++ (immer noch offen!!)



  • Vielen Danke, Borland hat die Funktion URLDecode() bereits und die erfüllt meinen Wunsch! 🙂

    MfG
    TheCaleb



  • Hm die URLDecode- Funktion ist bei der 2006er Version von Borland nur noch im Indy- Package enthalten und ich habe keine Ahnung, wie ich das anwenden sollte.
    Zudem fiel mir auf, dass Ä Ö Ü garnicht decodiert werden.
    Gibt es andere Funktionen die das können, also UTF-16 decodieren?!
    Oder gibt es vielleicht sofort ne Möglichkeit über XML Funktionen von einem NodeValue oder so auf einen dekodierten String zu kommen?



  • @ Akari hast du keine Idee, welche Funktion ich nutzen kann oder lässt du diesen Beitrag absichtlich links liegen, da dieses Thema schonmal behandelt wurde?
    Ich brauche halt Hilfe, da ich keine Funktionen finden kann oder die von Indy(leider ohne ÄÖÜ) nicht einbinden kann...

    Bitte helft mir doch weiter!! 🙄



  • URLDecode() war doch schon immer nur im Indy-Package mit drin. Das sollte doch auch im 2006er Builder mit dabei sein.



  • Ja ist es auch aber ich versteh nicht so ganz, wie ich diese Funktion einbinden kann, denn sonst ging das immer einfach so, dass ich diese Funktion einfach anwenden musste.
    Gibt es nicht auch noch zufällig andere Funktionen, die ebenfalls auch das Ä Ü Ö dekodieren?



  • Also wie ich in der beigehängten Borland Hilfe sehen kann, ist die URLDecode keine Funktion, sondern eine Methode geworden, doch wie konnte man nochmal ein Object einer Klasse erstellen also wie konnte man die Klasse nochmal einbinden?

    Borland Hilfe:

    Indy.Sockets version 10.1.1.

    URLDecode Method

    Declaration
    class function URLDecode(
    ASrc: string
    ): string;
    Parameters
    Parameters Description
    ASrc URL-encoded string to be decoded.

    Returns
    String - The un-encoded ASCII representation of the URL.
    Summary
    Converts a URL-Encoded string to a US-ASCII string.
    Description
    URLDecode is a string class function that converts the URL-encoded string in ASrc to its representation in the US-ASCII character set. URLDecode is based on the URL character encoding rules as described in the Internet Standards document:
    RFC 1738 - Uniform Resource Locators (URL)

    URLDecode can used to reverse any string encoding performed using URLEncode.

    URLDecode converts all occurrances of the '+' character to ' ' (Space) (Decimal 32). URLDecode reads any values represented as a hexadecimal character triplet consisting of the "%" character followed by the two-digit hexadecimal value for the octet, and returns the value to its US-ASCII representation.

    Example
    AString := TIdURI.URLDecode(AURLString);
    See Also
    TIdURI.URLEncode
    Class
    TIdURI



  • Hallo,

    Du mußt einfach ein Objekt vom Typ TIdURI erstellen. Dann kannst du dessen Membermethode nutzen. Etwa so

    TIdURI* uri = new TIdURI;
    AnsiString decode = uri->URLDecode(code);
    // delete uri dann nicht vergessen
    


  • Danke, ich habe jetzt folgendes geschrieben:

    TIdURI* uri = new TIdURI('asd');
    uri->URLDecode("ads");
    

    Doch angeblich müsste ich noch einen weiteren Parameter angeben, erst TMetaClass, dann erst mein String:

    [C++ Error] Unit1.cpp(70): E2034 Cannot convert 'char *' to 'TMetaClass *'
    [C++ Error] Unit1.cpp(70): E2342 Type mismatch in parameter 'vmt' (wanted 'TMetaClass *', got 'char *')

    Doch was ist eine Variabel von TMetaClass oder so?!
    Bzw wie müsste das dann aussehen?



  • Ich brauche immer noch Hilfe



  • Ok, ich hab mir mal die Headerdatei dazu angeschaut. Die Deklaration sieht so aus.

    static AnsiString __fastcall URLDecode(TMetaClass* vmt, AnsiString ASrc);
    

    Wie man sieht, ist die Funktion statisch (benötigt also kein zusätzliches Objekt) und der Konstruktor benötigt zwei Parameter.
    Der Aufruf müsste also so aussehen (ungetestet)

    TIdURI::URLDecode(__classid(TIdURI), "ads");
    


  • Wenn ich den Aufruf

    TIdURI::URLDecode(__classid(TIdURI), "ads");
    

    schreibe, dann treten folgende Fehler auf:

    [Linker Error] Error: Unresolved external 'Iduri::TIdURI::' referenced from ...UNIT1.OBJ
    [Linker Error] Error: Unresolved external '__fastcall Iduri::TIdURI::URLDecode(System::TMetaClass *, System::AnsiString)' referenced from ...UNIT1.OBJ

    Wenn ich dann die Indy10 einbinde, dann treten mehrere Fehler in der Datei HTTPApp.hpp auf, diese Datei nutze ich hingegen nicht bewußt:

    [C++ Error] Httpapp.hpp(94): E2293 ) expected
    [C++ Error] Httpapp.hpp(983): E2189 extern variable cannot be initialized
    [C++ Error] Httpapp.hpp(983): E2449 Size of 'ExtractHeaderFields' is unknown or zero
    [C++ Error] Httpapp.hpp(983): E2188 Expression syntax
    [C++ Error] Httpapp.hpp(983): E2293 ) expected
    [C++ Error] Httpapp.hpp(984): E2189 extern variable cannot be initialized
    [C++ Error] Httpapp.hpp(984): E2449 Size of 'ExtractHTTPFields' is unknown or zero
    [C++ Error] Httpapp.hpp(984): E2188 Expression syntax
    [C++ Error] Httpapp.hpp(984): E2293 ) expected
    [C++ Warning] Unit1.cpp(96): W8004 'NodeList' is assigned a value that is never used
    [C++ Error] Unit1.cpp(183): E2096 Illegal structure operation
    [C++ Error] Unit1.cpp(319): E2096 Illegal structure operation
    [C++ Error] Unit1.cpp(473): E2096 Illegal structure operation
    [C++ Error] Unit1.cpp(584): E2096 Illegal structure operation



  • Die erste Fehlermeldung wird durch eine fehlende lib verursacht.
    Versuche doch mal Indy9 statt 10 zu verwenden. Soweit ich weiß funktioniert Indy10 nicht richtig.
    Ich spreche hier aber nicht aus Erfahrung, da ich die Indy-Bibliotheken noch nie verwendet habe.



  • Wenn ich die Indy9 einbinde treten die ersten beiden Fehler auf!



  • Was kann ich machen, sodass ich diese Funktion benutzen kann oder einfach irgendwas, sodass ich meinen Text decodieren kann?!



  • Hallo

    Zumindestens das hier kompiliert :

    TIdURI* uri = new TIdURI(0);
      AnsiString Text = uri->URLDecode(__classid(TIdURI), "ads");
      delete uri;
    

    bis bald
    akari



  • Danke aber irgendwie tritt jedes mal, wenn ich die Indy10 einbinde die oben gennanten Fehler in der httpapp auf!
    Mit der Indy9 geht es garnicht.
    Kann man irgendwo die httpapp in einer neueren Version downloaden oder was mache ich falsch???
    Als include nehmen ich die IdURI.hpp...



  • Hallo

    TheCaleb schrieb:

    Danke aber irgendwie tritt jedes mal, wenn ich die Indy10
    einbinde die oben gennanten Fehler in der httpapp auf!

    Indy 10 läuft auf dem Builder gar nicht.

    Mit der Indy9 geht es garnicht.

    Das glaube ich dir nicht. Ich habe ein normal installiertes Indy 9 und habe den geposteten Code kompiliert.
    Desweiteren ist "geht nicht" keine Fehlerbeschreibung. Vermutlich hast du Indy 9 nicht richtig installiert bzw. im Projekt nicht richtig eingebunden.

    Kann man irgendwo die httpapp in einer neueren Version downloaden oder was mache ich falsch???

    Du wirst wohl Indy nicht in Einzelteilen bekommen oder zum laufen kriegen.

    Als include nehmen ich die IdURI.hpp...

    Das ist richtig.

    bis bald
    akari



  • Ok, ich nehme nun Indy9(wurde von dem Borland Builder mit installiert), den Code von dir und die besagte Include- Datei.
    Anschließend bekomme ich folgende Fehler:

    [Linker Error] Error: Unresolved external '__fastcall Iduri::TIdURI::TIdURI(const System::AnsiString)' referenced from ...\UNIT1.OBJ
    [Linker Error] Error: Unresolved external 'Iduri::TIdURI::' referenced from ...\UNIT1.OBJ
    [Linker Error] Error: Unresolved external '__fastcall Iduri::TIdURI::URLDecode(System::TMetaClass *, System::AnsiString)' referenced from ...\UNIT1.OBJ



  • Hallo

    Du must in dem Projekt noch die Library-Pfade anpassen, in dem du den Pfad zu Indy einträgst.

    bis bald
    akari



  • Beim BCB2007 ist Indy10 mit dabei. Vielleicht läuft es ja da.


Anmelden zum Antworten