AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein UTF8 als WideString an ActiveX (LPCTSTR)
Thema durchsuchen
Ansicht
Themen-Optionen

UTF8 als WideString an ActiveX (LPCTSTR)

Ein Thema von taveuni · begonnen am 22. Mai 2012 · letzter Beitrag vom 23. Mai 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.380 Beiträge
 
Delphi 12 Athens
 
#1

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 22. Mai 2012, 18:17
Und du bist dir wirklich sicher, daß LPCSTR bei dir als UTF-8 verwendet werden kann, bzw. kann man irgendwo den verwendeten Charset einstellen?

Wenn es unter D6 mit LPCSTR nur ANSI verarbeitet wurde, dann wird es, bei gleicher Schnittstelle auch jetzt immernoch nur als ANSI arbeiten.


Wie sieht den die TLB aus?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
535 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 22. Mai 2012, 19:07
Hallo himitsu,

Ich bin mir insofern sicher als dass in anderen Programmiersprachen dieses so dem ActiveX als Array of Char
übergeben kann und dieses (das ActiveX) dies richtig verarbeitet. Allerdings habe ich natürlich die Sourcen des ActiveX nicht.

Auszug aus der TLB

Delphi-Quellcode:
// *********************************************************************//
// DispIntf: _DGeheimeFirmaActiveXControl
// Flags: (4112) Hidden Dispatchable
// GUID: {EC277D05-8AA2-41F5-91AA-8EE7DBD55C77}
// *********************************************************************//
  _DGeheimeFirmaXControl = dispinterface
    ['{EC277D05-8AA2-41F5-91AA-8EE7DBD55C77}']

    function DlmXBackup(ulCameraFilter: Integer; ulStartTimeStampSec: Integer;
                        ulStartTimeStampMillis: Integer; ulStopTimeStampSec: Integer;
                        ulStopTimeStampMillis: Integer; const strFilename: WideString;
                        const strFormat: WideString): Integer; dispid 21;

    function DlmXConfig(const strConfigXML: WideString): Integer; dispid 25;
Bei der Funktion DlmXBackup gehts hier um den Parameter strFilename.
In der Funktion DlmXConfig kann/muss ich vorgängig dieses XML mitgeben:

Code:
<DlmSDK><DlmConfig><Display CodePage=“utf-8” /></DlmConfig></DlmSDK>
<DlmSDK><DlmConfig><Display CodePage=“ISO-8859-1” /></DlmConfig></DlmSDK>
<DlmSDK><DlmConfig><Display CodePage=“windows-1251” /></DlmConfig></DlmSDK>
Wird damit vielleicht das Charset eingestellt?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.380 Beiträge
 
Delphi 12 Athens
 
#3

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 22. Mai 2012, 22:42
Hmmm.

Also ein Problem ist ersmal, daß seit mindestens Delphi 2009 (hab nie im 2007er nachgesehn) die Delphi-Strings (AnsiString, RawByteString, UTF8String, also alle AnsiString-Nachfahren und natürlich der neue UnicodeString) über eine CodePage-Information verfügen.

Anhand dieser CodePage wird notfalls eine Convertierung vorgenommen.
Delphi erkennt also, daß du einen UTF-8-kodierten String (AnsiString+CP_UTF8) an einen Unicode-String (WideString) übergeben willst und wandelt den enthaltenen Text "korrekt" um ... macht also aus dem UTF-8 wieder Unicode.

Das andere Problem ist, daß wir nicht wissen wie Windows das, bzw. deren Code, intern aus dem WideString/PWideChar einen PAnsiChar/LPCSTR macht.
(das müßtest du mal erdebuggen oder eben ausprobieren)

Versuch es mal so:
Delphi-Quellcode:
function WUConvert(const S: string): WideString;
var
  A: UTF8String;
begin
  A := UTF8Encode(S);
  SetCodePage(A, CP_ACP, False);
  Result := A;
end;

// und falls es doch nicht geht, dann eventuell so?

function WUConvert(const S: string): WideString;
var
  A: UTF8String;
begin
  A := UTF8Encode(S);
  SetCodePage(A, $FFFF, False);
  Result := A;
end;

// oder

function WUConvert(const S: string): WideString;
var
  A: UTF8String;
  i: Integer;
begin
  A := UTF8Encode(S);
  SetLength(Result, Length(A));
  for i := 1 to Length(A) do
    Result[i] := A[i];
end;

PS: Dein <DlmSDK><DlmConfig><Display CodePage="..." /></DlmConfig></DlmSDK> ist eh nur ASCII, drum kann man sich dort alles sparen und kann es problemlos direkt übergeben.

PPS: Sicher daß “ und ” korrekt sind und nicht eigentlich " dort hingehört?
Ein korrektes XML ist das so jedenfalls nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
535 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 23. Mai 2012, 08:43
Hallo himitsu,

SetCodePage erwartet einen RawByteString.
Ich habe bei den ersten zwei Funktionen den UTF8String durch diesen ersetzt.
Die letzte lässt sich nicht kompilieren.

Mit der ersten Variante funktionierts!
Es ist mir noch nicht ganz klar weshalb.
Kannst Du mich aufklären?

UTF8Encode(s) hatte ich ja schon gemacht.
Nun ist "nur" noch das SetCodePage hinzugekommen.

Auf jeden Fall danke ich Dir vielmals. Du hast meine Woche gerettet.
Ich hoffe Du kannst Dein profundes Wissen auch beruflich angemessen einsetzen.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.380 Beiträge
 
Delphi 12 Athens
 
#5

AW: UTF8 als WideString an ActiveX (LPCTSTR)

  Alt 23. Mai 2012, 09:03
UTF8Encode setzt als Codepage CP_UTF8, was eigentlich auch richtig so ist.
Mit SetCodePage wurde die Codepage nun auf $FFFF gesetzt, was einem RawByteString entspricht.
Wenn man jetzt diesen AnsiString/RawByteString an einen UnicodeString oder WideString zuweist, dann nutzt Delphi die Codepage für die Convertierung.
Es macht also implizit paraktisch ein UTF8Decode, da in den WideString Unicode reingehört.
Über den RawByteString, welcher nun dein UTF-8 enthält, aber über SetCodePage+CP_ACP gesagt bekommen hatte er enthält "angeblich" ANSI, wird nun bei der Umcodierung nicht von UTF8 nach Unicode, sondern von ANSI nach Unicode umgewandelt, also so als wenn es ANSI-Zeichen währen.

Intern wird anscheinend ebenfalls immer nur von Unicode nach ANSI umgewandelt, egal was du als Setting vorgegeben hast.
Da hätte die Entwicklerin selber für eine korrekte Konvertierung sorgen müssen.

PS: Bis mindestens Delphi 7 hat Delphi alles in einem AnsiString auch als ANSI angesehn, selbst wenn man vorher ein UTF-8 dort reingeschoben hatte.
Dort gab es die CodePage an jedem String noch nicht und somit hätte man damals UTF-8 problemlos nutzen können, ohne soeinen Krampf durchzumachen.

Aber eigentlich ist die Entwicklerin Schuld, denn wenn die den WideString auch als Unicode nutzen und dann intern korrekt umwandeln würde, dann müßte man nicht versuchen in dem Unicode-String ein verstümmeltes UTF-8 mitgeben zu müssen.


Und du mußt aufpassen, denn wir in Deutschland haben kein MultiByte im ANSI, sondern nur eine SingleByte-Codepage ... jedes Byte ist ein Zeichen.
Die Asiaten haben ein paar mehr Zeichen, drum nutzen sie eine richtige MultiByte-CodePage.

Außerdem gibt es für einige Unicode-Zichen mehrere/verschiedene ANSI-Darstellungen.
Es könnte also Probleme bei der Rückumandlung geben, da das UTF-8 implizit ein gemapptes über ANSI umgeleitet wird, mit Hin- (ANSI>Unicode) und Rückübersetzung (Unicode>ANSI), vobei das UTF-8 eventuell zerstört werden könnte.


So, ich hoffe mal, ich hab jetzt keinen Knoten im Hirn.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (23. Mai 2012 um 09:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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