![]() |
Delphi-Version: 7
Erläuterung was "native unicode string" ist?
Hallo Wissende,
ich habe ein Riesen-Problem. Ich ziehe mir aus einer XML-Datei Teamnamen. Die XML-Datei ist in UTF-8 formatiert. Zum Anzeigen im Programm benutze ich die TntControls. Da sieht das alles super aus. Nun sende ich diese Inhalte (WideStrings und TWideStringlist) via TCP-Protokoll an eine Empfangende Software, die mir die inhalte visualisiert. Leider wird dabei aus dem gesendeten String: Widzew Łódź Das hier: Widzew Łó Es fehlen also Zeichen. Es kann nicht an der Schriftart liegen, da die Anbieter der Rendering-software auch einen Designer haben. Wenn ich dort den String reinkopiere, wird der Inhalt korrekt gerendert. Es muss also an der Übermittlung irgendwo haken. Der Programmierer, den ich daraufhin angeschrieben habe, teilte mir folgendes mit: "Please double check that the value passed to Tk5 has proper value. It should be native unicode string, not UTF-8." Ich bin jetzt natürlich etwas ratlos und würde mich über ein paar Ratschläge freuen. |
AW: Erläuterung was "native unicode string" ist?
Für den Zweck würde sich zwar eine neuere Delphiversion (2009+) als die bei dir angegebene Version Delphi 7 wegen voller Unicodeunterstützung besser eignen, aber nichtsdestotrotz sollten WideStrings auch in Delphi 7 bereits funktionieren, da sie vom Betriebssystem verwaltet werden.
WideStrings sind auch nicht UTF-8, sondern benutzen tatsächlich die 2 Byte pro Zeichen. Kannst du vielleicht einmal exakt die Bytes posten wie du sie via TCP versendest? Und wie verschickst du diese? |
AW: Erläuterung was "native unicode string" ist?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sebastian,
meine Angaben waren wohl nicht ganz korrekt. Also die Strings aus dem XML visualisiere ich als WideStrings z.B. in einem TTntEdit Das Sammeln der Daten geschieht über TWideStrinlists aus der Unit JclUnicode. Dann übergebe ich die Liste an eine selbst geschriebene Komponente, die die Daten dann an ein ComObjekt (GSTK5Lib_TLB) übergibt. Das Ding connected sich zum Renderer. Der Fehler liegt wohl definitiv auf meiner Seite, nur weiss ich noch nicht genau wo. Ich könnte den Code der Komponente und das Sender der Daten hier Posten, aber die Komponente selbst hat 900 Zeilen Code. Der Programmierer hat mir noch einen Link zu den ![]() Hier aber mal die XML-Datei, aus der ich auslese. Was mich eben auch verwirrt, ist der Umstand, dass die Sonderzeichen nicht grundsätzlich NICHT funktionieren, sondern es nur partiell zu Problemen kommt. |
AW: Erläuterung was "native unicode string" ist?
Unicode Zeichen im UTF-8 Format benötigen zwischen 1-4 Byte. Womöglich werden einige Bytes nicht mitgeschickt weil die Längenberechnung des Strings nicht stimmt. SizeOf(...) wäre hier ganz falsch.
UTF-16 braucht 2-4 Bytes, die Länge muss auch hier berechnet werden. Kann passieren, wird aber oft vernachlässigt. Ich nehme wohl an, dass er die Daten in diesem Format erwartet, denn es würde WideString entsprechen. Dann gibt's noch UTF-32, das hat immer 4 Byte. |
AW: Erläuterung was "native unicode string" ist?
Zitat:
Wenn du dort einen Haltepunkt setzt: Sind die Daten dort noch korrekt? |
AW: Erläuterung was "native unicode string" ist?
ich checks mal und melde mich dann wieder.
danke erstmal soweit. |
AW: Erläuterung was "native unicode string" ist?
Also ich habs jetzt mal überprüft.
Der Aufruf in der TLB_Unit sieht so aus:
Delphi-Quellcode:
Sprich ich übergebe den Namen des Objektes, dann den Typ (text) und dann den Inhalt des Objektes.
procedure set_(const address: WideString; const attrName: WideString; value: OleVariant); safecall;
Der Aufruf dieser Procedure in meiner Komponente läuft so ab:
Delphi-Quellcode:
TextString, LogoString sind vom Typ her TWideStringlist
//AUSSCHNITT
//hier werden die texte aus der TWideStringlist einzeln übergeben for i := 0 to TextString.Count - 1 do loc_AkiTitle.set_(TextString.Names[i],'Text',TextString.Values[TextString.Names[i]]); //hier werden die logos aus der TWideStringlist einzeln übergeben for i := 0 to LogoString.Count - 1 do loc_AkiTitle.set_(LogoString.Names[i],'FileName',LogoString.Values[LogoString.Names[i]]); //hier werden zusätzliche Eigenschaften aus einer TWideStringlist einzeln übergeben for i := 0 to PropList.Count - 1 do loc_AkiTitle.set_(PropList.Items[i].str_Name,PropList.Items[i].str_Type,PropList.Items[i].str_Value); Also sollte das doch so passen. Oder? Obwohl, ich sehe gerade, dass der eigentliche Inhalt vom Typ her value: OleVariant ist. Kann hier die Ursache für das Problem liegen? Inhalte, die ich aus Edits hole, kommen ausschließlich von TTntEdits. Die TWideStringlist habe ich mir fertig von der JCL geborgt. Ich hoffe, dass das eventuell etwas hilft, mir bei meinem Problem zu helfen? |
AW: Erläuterung was "native unicode string" ist?
Hmm, testweise könntest du TextString.Values[TextString.Names[i]] usw. einmal in WideString Variablen zwischenspeichern bevor du es übergibst.
|
AW: Erläuterung was "native unicode string" ist?
Nur, um kurz mal sicher zu gehen.
Du meinst, ich soll mir die 2 übermittelten Werte jeweils in einer WideString-Variablen zwischenspeichern und dann der TLB-Funktion übergeben? Wäre dabei was anders? Oder soll ich mir das dann loggen? Was ist der Hintergrund Deines Vorschlags? |
AW: Erläuterung was "native unicode string" ist?
So nebenbei würde ich auch 'ValueFromIndex' verwenden. Tut zwar nix zur Sache, ist aber schneller und übersichtlicher.
Delphi-Quellcode:
for i := 0 to TextString.Count - 1 do
loc_AkiTitle.set_(TextString.Names[i],'Text',TextString.ValueFromIndex[i]); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz