AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codierung
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codierung

Ein Thema von phu · begonnen am 12. Jun 2008 · letzter Beitrag vom 12. Jun 2008
Antwort Antwort
phu

Registriert seit: 11. Apr 2006
8 Beiträge
 
#1

Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codierung

  Alt 12. Jun 2008, 09:16
Hallo zusammen

Ich habe eine Knacknuss mit einer Unicode-Darstellung mit UTF-8. Ich habe das Problem, wenn ich ein Zeichen übergebe, dass mir das Zeichen nicht dargestellt wird.

Grundsätzlich habe ich meine Klassen so erweitert, dass die UTF-8 codierung als Caption übergeben werden kann, die anschliessend intern in WideString umgewandelt und mit der DrawTextW als Unicode ausgegeben wird. Als Font verwende ich Arial Unicode MS.

Nun habe ich festgestellt, dass Zeichen in höherem Adressraum nicht dargestellt werden. Ich meine zu glauben, dass ich 2005 mit der gleichen Methode erfolgreich war und kann mir nicht erklären weshalb die Zeichen nicht mehr dargestellt werden.

Als Beispiel habe ich die Beispielklasse verwendet, die von CalganX hier im Forum veröffentlicht wurde. Mit dieser Klasse habe ich das gleiche Problem wie bei meinen eigenen Klassen:
Link zu TUnicode-Label-Klasse

Illustration Abfüllung des Textes mit einem chinesischen Zeichen (D481#) in UTF-8-Codierung (EFC883#):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fName : WideString;
begin
  fName :=UTF8Decode(Chr(StrToInt('$EF'))+chr(strtoint('$C8'))+chr(strtoint('$83')));
  UnicodeLabel.Caption := fName;
end;
Für einen heissen Tipp wo das Problem liegen könnte, bin ich sehr dankbar!
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#2

Re: Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codieru

  Alt 12. Jun 2008, 10:19
Nicht falsch verstehen aber so wie du deinen Buchstaben zusammenbastelst könnten einem die Augen tränen. Es geht auch viel einfacher und du musst dann keine Umwandlungen über Integer machen. Mit #dezialwert definierst du ein Zeichen anhand eines Dezimalwertes. Mit #$hexwert definierst du ein Zeichen anhand eines Hexwertes.

Delphi-Quellcode:
String := #$EF#$C8#$83;
// oder
String := #$EF + #$C8 + #$83;
Beides ist gleich nur, dass das untere Besser zu lesen ist. Aber bei beiden Methoden handelt es sich um einen konstanten String. In deinem Beispiel muss erst mittels Code der String erzeugt werden.


Hast du mal geschaut was nach UTF8Decode raus kommt. Ob da auch wirklich dein Wert enthalten ist? Wenn das UTF-8 stimmt, dann sollte es aber. Und stelle bitte ganz sicher, dass du auch das entsprechende Font benutzt. Im Falle eines nicht findens nimmt Windows ein anderes. Wenn das dann ausgerechnet Arial ist, dann merkt man den Unterschied kaum bzw nur dann wenn Zeichen fehlen.

Zitat von msdn:
If nCount is 1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically.
Diese Passage sollte bei dir zutreffen, da du nur ein einziges Zeichen hast. Im Label wird der String mit @String[1] übergeben. Ich meine mich daran zu erinnern, dass es mit @Blah[1] durchaus passieren kann, dass am Ende des Textes kein explizites #0 hängt. Wenn man den Pointer eines WideStrings mit pWideChar(WideString) ermittelt sorgt Delphi meines Wissens nach dafür, dass dort ein #0 anhängt. Ich muss aber gestehen ich bin mir nicht ganz sicher mit dem @Blah[1]. Ich arbeite immer mit dem anderen Weg. Im Zweifel nimm mal testweise dein Zeichen doppelt.

Sonst wüsste ich nicht was es sein könnte. Eigentlich ist das alles ja auch nicht so komplex.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codieru

  Alt 12. Jun 2008, 10:34
mißt, war einer schneller

Was ist UnicodeLabel für ein Objekt?
und hast du mal in den WideString (fName) geschaut, was darin steht?


fName ist WideString und somit wird auch bei nur einem Zeichen ein #0 angehängt ... daran sollte es also nicht hängen.

gibt UTF8Decode nicht bei einem Fehler in der UTF8-Codierung einen Leerstring zurück?
(dann dürfte aber auch garkein Zeichen angezeigt werden, wenn er den String nicht dekodieren kann :grüebel: )

die Zeichen sind auch in Arial Unicode MS enthalten?
/me verwendet meißt eines davon PMingLiU, MS Gothic, MS Mincho, MS PGothic, MS PMincho, MS UI Gothic



UTF8Decode(Chr($EF)+chr($C8)+chr($83)); oder wie Lossy eX schon Zeigte direkt per
UTF8Decode(#$EF#$C8#$83) ansonsten wüßte ich auch nicht woran es hängen kann arbeite leider nur direkt mit Unicode (kein UTF8 mehr, aber damit hatte ich früher noch keine Probleme gehabt) und der WinAPI (keine Fremdkomponenten)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
phu

Registriert seit: 11. Apr 2006
8 Beiträge
 
#4

Re: Problem mit Unicode-Zeichen-Darstellung mit UTF8 Codieru

  Alt 12. Jun 2008, 13:51
Hallo zusammen

Volle Punktzahl für himitsu. Ich habe die Kleider zerissen und Asche über mich geworfen!

Nach Konsulatation des Wikipedia Beschreibung UTF-8 habe ich festgestellt, dass ich das Unicode-Zeichen falsch codiert habe. Aus diesem Grund wurde kein Zeichen dargestellt.

Nun habe ich sämtliche Text-Klassen erweitert und die Applikation kann sämtliche Unicode-Zeichen anzeigen und unsere Dokumentationsabteilung kann mit der Übersetzung beginnen. Herzlichen Dank für eure Hinweise.

Lassy eX: Natürlich ist die Schreibweise nicht optimal. Aber irgendwie habe ich den Syntax, wann ich welches # oder $ Zeichen benutzen muss nie Intus und so verwende ich bei einem Entwurf wo es schnell gehen muss die "Holzhammermethode"...
  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 20:11 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