AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi <= 7 Unicode Conversion Bug

Ein Thema von ulrich.b · begonnen am 5. Apr 2007 · letzter Beitrag vom 10. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#1

Delphi <= 7 Unicode Conversion Bug

  Alt 5. Apr 2007, 17:21
Wenn ich in Delphi 7 und vorher einen String in einen WideString konvertiere macht (so weit ich das sehe) Delphi nichts anderes, als das String Byte in das Lo-Byte des WideString Characters zu kopieren, und nicht das Zeichen, abhängig vonm der aktuellen System Charset Einstellung richtig zu konvertieren!!!


Z.B.:
Das "ö" hat in der Westlichen Codepage den Code 0xF6
In der griechischen CodePage ist 0xF6 aber ein kleines Phi "φ"

Wenn ich nun ein 0xF6 in ein Unicode Zeichen konvertieren will sollte es eigentlich abhängig von der Systen Codepage in ein Unicode Zeichen konvertiert werden. Was passiert ist aber, dass es immer in ein 0x00F6 konvertiert wird (ist in diesem Fall zufälligerweise das kleine "ö") ...

Wie kann ich dieses Verhalten von Delphi fixen (es ist ja eine Function in der System Unit)?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 5. Apr 2007, 17:47
Das kann ich so nicht nachvollziehen (D6) bzw. versteh es nicht ganz.
Zeit mal genau den Code den du verwendest!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 5. Apr 2007, 17:54
In der Unit System gibt es folgende Funktion
Delphi-Quellcode:
function StringToWideChar(const Source: string; Dest: PWideChar;
  DestSize: Integer): PWideChar;
begin
  Dest[MultiByteToWideChar(0 {=CP_ACP}, 0, PChar(Source), Length(Source),
    Dest, DestSize - 1)] := #0;
  Result := Dest;
end;
Der Parameter CP_ACP bedeutet "ANSI code page".
Ich vermute nun, dass Delphi obige Funktion verwendet und damit immer die ANSI Code Page als Ausgangspunkt nimmt.
Welchen Wert liefert denn die Funktion GetACP() auf deinem (grichischen) System ?
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 5. Apr 2007, 21:20
Es könnte je nachdem wie es im Code definiert ist einfach die Tatsache zuschalgen das Delphi-Pas-Dateien bei Delphi > Version 8 immer Ansi-Textdateien sind und deshalb beim Compilieren mit der aktuellen Codepage umgesetzt werden müssen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 9. Apr 2007, 15:49
Zitat von Bernhard Geyer:
Das kann ich so nicht nachvollziehen (D6) bzw. versteh es nicht ganz.
Da da jemand ungläubig ist, hab ich 2 Screenshots gemacht. Ein Screenshot auf einem System mit deutscher Codepage und einen mit griechischer. Man sieht, dass bei der Umwandlung in den WideString beide Male das selbe Ergebnis rauskommt, obwohl verschiedene Zeichen umgewandelt werden.


Eben der Bug, den ich oben beschrieben habe!!!

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  Str : String;
  WStr : WideString;

  WStrLen : Integer;

  HexStr : String;

  i : Cardinal;

  p : Pointer;

  ByteVal : Byte;

begin
  Str := Edit1.Text;

  WStr := Str;


  WStrLen := Length(WStr);

  p := @WStr[1];

  HexStr := '';

  for i := 0 to WStrLen * 2 do
  begin
    ByteVal := PByte((Cardinal(p) + i))^;

    HexStr := HexStr + IntToHex(ByteVal, 2);
  end;

  Label1.Caption := HexStr;
end;
Miniaturansicht angehängter Grafiken
greek_127.png   german_195.png  
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 9. Apr 2007, 18:46
Hast Du evtl. die TNT's installiert und dort die "Fixes" für die Systemroutinene installiert/aktiviert?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 10. Apr 2007, 09:25
Zitat von ulrich.b:
Ein Screenshot auf einem System mit deutscher Codepage und einen mit griechischer. Man sieht, dass bei der Umwandlung in den WideString beide Male das selbe Ergebnis rauskommt, obwohl verschiedene Zeichen umgewandelt werden.
Die VCL/RTL kann nicht wissen, welche Codepage du verwendet hast!!
Die Funktion GetACP() liefert die default Codepage deiner Windows-Installation.
Wenn die Codepage des TFont-Objekts davon abweicht, musst du die Zeichenkonvertierung selbst vornehmen.
Delphi-Quellcode:
function StringToWideCharEx(const Source: string;SourceCP:integer; Dest: PWideChar;
  DestSize: Integer): PWideChar;
begin
  Dest[MultiByteToWideChar(SourceCP, 0, PChar(Source), Length(Source),
    Dest, DestSize - 1)] := #0;
  Result := Dest;
end;


begin
  Str := Edit1.Text;
// WStr := Str;
  // ungetestet
  SetLength(WStr, Length(Str));
  StringToWideCharEx(Str, Edit1.Font.Charset, @Wstr[1], Length(Str)*2);
Andreas
  Mit Zitat antworten Zitat
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 10. Apr 2007, 15:03
Zitat von Bernhard Geyer:
Hast Du evtl. die TNT's installiert und dort die "Fixes" für die Systemroutinene installiert/aktiviert?
NEEEEEEIN! Ich hab sie eben NICHT installiert. Mit den FIXES geht das alles auch in Delphi 7. OHNE Ihnen ja auch in Delphi >= 2005! Trotzdem will ich es in Delphi 7 hinbekommen!

Zitat von shmia:
Die VCL/RTL kann nicht wissen, welche Codepage du verwendet hast!!
Die Funktion GetACP() liefert die default Codepage deiner Windows-Installation.
Wenn die Codepage des TFont-Objekts davon abweicht, musst du die Zeichenkonvertierung selbst vornehmen.
Ja genau desshalb sprech ich ja von einem Delphi BUG! Es sollte doch die System CodePage ausgelesen werden und danach, abhängig von dieser, die Umwandlung passieren!

... Natürlich weiß ich, dass ich die "MultiByteToWideChar" Funktion selbst benutzen kann, nur will ich keinesfalls in einem doch relativ umfangreichen (vor allem Strigverarbeitungsintensiven) Projekt nicht auf die Implizite String zu WideString Umwandlung verzichten!!!

LG Ulrich
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 10. Apr 2007, 15:25
Gibt mal ein Beispielprojekt rüber mit der genauen Anleitung was wann passiert.
Irgendwie ist bei uns oder bei dir noch irgendwo ein Knoten im Gehirn.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Delphi <= 7 Unicode Conversion Bug

  Alt 10. Apr 2007, 16:16
Zitat von Bernhard Geyer:
Gibt mal ein Beispielprojekt rüber mit der genauen Anleitung was wann passiert.
Irgendwie ist bei uns oder bei dir noch irgendwo ein Knoten im Gehirn.
Bitte nimm dir kurz mal Zeit, um meinen oben geposteten Code auszuführen, ...

Stell in Windows einmal auf z.B. deutsch oder englisch und ein zweites mal auf griechisch (Zu finden unter den "Region/Spracheinstellungen" auf der "Erweitert" - Page, ... reboot erforderlich)

... dann starte das Programm und gib "ö" auf deiner deutschen Tastatur ein!

Beides Male wandelt Delphi/mein Code das "ö" in ein F600 (little endian, was einem 0x00F6 entspricht).

Und .... jetzt kommts ...

Es sollten doch 2 verschiedene Zeichen rauskommen!

Genauer: bei Englischer Einstellung: 0x00F6 (kleines ö) und bei griechisch 0x03C6 (kleines phi).

... Oder sehe ich da irgend etwas falsch?

EDIT:
Der Bug den ich meine, ist wahrscheinlich genau der, der von den TNT Controls, die es ja jetzt nicht mehr gibt, extern gefixt wird!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:04 Uhr.
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