Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Erläuterung was "native unicode string" ist? (https://www.delphipraxis.net/161517-erlaeuterung-native-unicode-string-ist.html)

torud 7. Jul 2011 09:31

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.

jaenicke 7. Jul 2011 09:43

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?

torud 7. Jul 2011 09:59

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 Delphi-Fundamentals geschickt.

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.

Daniela.S 7. Jul 2011 10:56

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.

jaenicke 7. Jul 2011 11:40

AW: Erläuterung was "native unicode string" ist?
 
Zitat:

Zitat von torud (Beitrag 1110501)
Dann übergebe ich die Liste an eine selbst geschriebene Komponente, die die Daten dann an ein ComObjekt (GSTK5Lib_TLB) übergibt.

Dann ist genau das der entscheidende Code. Wie sehen die Deklaration und der Code an genau dieser Stelle aus (in der Objekt-TLB-Unit und dein Aufruf)?

Wenn du dort einen Haltepunkt setzt: Sind die Daten dort noch korrekt?

torud 7. Jul 2011 13:45

AW: Erläuterung was "native unicode string" ist?
 
ich checks mal und melde mich dann wieder.
danke erstmal soweit.

torud 8. Jul 2011 12:20

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:
procedure set_(const address: WideString; const attrName: WideString; value: OleVariant); safecall;
Sprich ich übergebe den Namen des Objektes, dann den Typ (text) und dann den Inhalt des Objektes.

Der Aufruf dieser Procedure in meiner Komponente läuft so ab:
Delphi-Quellcode:
      //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);
TextString, LogoString sind vom Typ her TWideStringlist

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?

jaenicke 8. Jul 2011 14:17

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.

torud 9. Jul 2011 08:30

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?

FredlFesl 9. Jul 2011 08:47

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 03:35 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz