| Autor |
Beitrag |
Seven of Nine
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Mi 10.06.09 06:20
Ich bin gerade dabei in eines meiner Programme (Vokabel-Trainer, TrainIt) eine Unicode Unterstützung einzubauen.
Das ganze ist für mich derzeit noch absolutes Neuland und ich möchte es möglichst effizient erlernen.
Benötigte Funktionalität
- Darstellung von Unicode Zeichen
- Einfache Eingabe von Unicode-zeichen durch Anwender
- Wahl eines Unicode Charsets durch Anwender
- Speichern der Unicodezeichen als Teil einer Textdatei
(die für die normalen "Nicht Unicode Zeichen" bereits existiert und um Uicode Funktionalität erweiter werden muss)
Gibt es so etwas wie ein Unicode FAQ?
Empfehlenswerte Threads? (die SuFu ist leider nicht wirklich hilfreich)
lG Martin
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 10.06.09 08:12
Vor Delphi 2009 bleibt was die visuelle Anzeige angeht nur die Verwendung von Komponentensammlungen wie den TNT Unicode Controls. Die VCL selbst unterstützt Unicode erst mit Delphi 2009.
Als Schriftart bietet sich z.B. Arial Unicode MS an, die standardmäßig vorhanden ist.
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Mi 10.06.09 14:12
Hallo Sebastian, Hallo@all:
TNT Komponente installiert und die Eingabe + Darstellung mit Unicode-Zeichen funktioniert soweit ich das beurteilen kann inzw. sauber.
Problemchen macht mir allerdings noch das abspeichern von UniCode zeichen, da ich mit einer Standard-Textdatei arbeite und das auch nicht umstellen möchte.Das geht aber scheinbar nicht ohne etwas Zusatzaufwand.
Ich würde jetzt einen einfachen Parser schreiben der jeden Buchstaben überprüft ob Unicode J/N. Falls Unicode würde ich diesen "umwandlen" zB mit einer Art Chr-Funktion. Diesen dann mit einer speziellen Text-Formatierung (spezifischer textblock am Anfang/Ende) abspeichern.
Beim einladen des textes würde ich die Textdatei nach den spezifischen textblöcken parsen und daraus wieder UniCode erstellen.
Das sollte codetechnisch kein Problem sein. Was allerdings ein Problem für mich ist, ist in einem WideString einzelne "Unicode-zeichen" von den "Nicht-Unicode-Zeichen" zu unterscheiden, bzw. herauszufiltern.
-> Gibt es dafür eine Funktion in Delphi?
lG Martin
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 10.06.09 14:22
Dieses spezielle Textformat nennt sich UTF8 und kann sogar schon Delphi 5. Man muss dafür lediglich die richtigen String-Funktionen hernehmen und mit WideStrings statt mit AnsiStrings arbeiten.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Mi 10.06.09 21:52
Danke Benny
das hört sich zunächst mal nach wenig Code-Update für mich an und wäre deswegen natürlich genial.
i'll keep u up-2date
lG Martin
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Fr 12.06.09 07:32
Hier meine bisher gemachten UniCode-Erfahrungen
- jedes einzelne Element/Komponente das UniCode fähig sein soll muss im Formular-Designer durch die Unicode-konforme Ersatzkomponente (z.B. TNT) ersetzt werden. An/Aus den einzelnen Elementen übergebene Strings müssen durch "WideStrings" ersetzt werden (..beides logisch, aber Anfängern wie mir zunächst vlt. nicht so bewusst)
- es gibt auch UniCode konforme Typen die anstelle der üblichen Typen verwendet werden müssen wenn eingesetzt. Beipielhaft hier "TTntStringlist" anstelle "TStringlist" ....nicht vergessen
- Beim einlesen von Textfiles ist zu unterscheiden ob das Textfile "Unicode konform" oder "eben nicht" gespeichert war sonst gibt's Probleme!
Unicode kann nicht in einem "Standardtextfile" gespeichert werden da nicht genügend Bytes/Zeichen vorhanden sind. Hierzu gibt es das oben schon erwähnte UTF8 Textformat das das kann
die wichtigsten Funktionen hierzu
UTF8Encode(EinWideString) -> sorgt dafür das ein WideString in UTF8 encodiert wird
UTF8Decode(EinWideString) -> sorgt dafür das ein UTF8 String entcodiert wird
Ich wollte meine existierenden Files nicht umschreiben. Habe deswegen jetzt Standard/UTF8 gemixte Files (...ja , das geht...) und dazu jeweils ganz zu Anfang einen neuen UTF8-bezeichner eingebaut der dies angibt. Ist er vorhanden werden die folgenden Zeilen UTF8 decodiert, wenn nicht ... dann wird ohne Decodierung eingelesen. Neu erstellte Files logischerweise ab jetzt immmer in UTF8, der Anwender merkt davon nichts.
- Zur korrekten Darstellung der Unicode-Zeichen, sind 2 Eigenschaften wichtig
Font.Name := @Arial Unicode MS (meine Empfehlung)
Font.Charset := landesspezifisches_CHARSET muss gewählt werden
lG Martin
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Fr 12.06.09 10:21
jaenicke hat folgendes geschrieben : | | Als Schriftart bietet sich z.B. Arial Unicode MS an, die standardmäßig vorhanden ist. |
Ist es nicht. Arial Unicode ist Bestandteil von MS Office und darf nicht eigenständig verteilt werden.
Unter NT nimmt man Arial, für W2K, XP, W2K3 nimmt man Tahoma (entsprechende Einstellungen im OS für Schriftartunterstützung vorrausgesetzt) und ab Vista "Serge?? UI" (hag gerate nur XP)
Seven of Nine hat folgendes geschrieben : |
- Zur korrekten Darstellung der Unicode-Zeichen, sind 2 Eigenschaften wichtig
Font.Charset := landesspezifisches_CHARSET muss gewählt werden |
Sollte man tunlichst lassen. Charset auf default stehen lassen. Bei korrekten Unicode-Controls ist diese Einstellung irrelevant und bei Nicht-Unicode-Controls wird dieser oft ignoriert (Sprich: Es funktioniert nicht).
In der Ausgabe "Der Entwickler", Ausgabe 5.2003 habe ich einen Artikel über Unicode und Delphi geschrieben (Titel: "We are a world").
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 12.06.09 10:34
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Fr 12.06.09 16:07
Hmmm da sieht man mal wieder das man "nichts weiß"
Aber ich bin zumindestens nicht lernresistent;)
@Bernhard: Da du den Artikel ja selbst geschrieben hast. ->Könntest Du ihn mir bitte zukommen lassen? Ich möchte mir nämlich nicht unbedingt diese kpl. Ausgabe vom Entwickler extra bestellen.
Zum Thema Unicode unter Delphi findet man im Netz ansonsten soviel verwirrendes, teilweise falsches. Und Try&Error ist auch nicht so mein Ding.
Thx & lG Martin
PS: Habe gerade mal gegoogelt nach diesem Artikel. Treffer 6 ist jetzt schon dieser Thread hier im Board.  Es ist schon immer wieder erstaunluch wie schnell Google's Spider reagieren.
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Fr 12.06.09 21:43
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 13.06.09 00:01
Bernhard Geyer hat folgendes geschrieben : | | Für D2009 hat Nick einige Artikel Online auf Codegear Developer Network bereit gestellt. |
Ja, die sind interessant gewesen.
Hier der Link zum Blog, wo die verlinkt sind:
blogs.embarcadero.co...ges/2008/11/20/39149
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Sa 13.06.09 11:16
Danke Bernhard, Danke Sebastian
ich glaube das ist ein handfester Grund für mich endlich mal auf D2009 umzusteigen.
Wenn alles gut läuft habe ich dann keine weiteren Fragen mehr
lG Martin
PS: der verlinkte Blog ist scheinbar nicht stabil Online. Ich musste es 4 mal versuchen bis ich die Informationen aufrufen konnte. Ein erster Blick darauf:= "sehr übersichtlich"!
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 13.06.09 11:25
Seven of Nine hat folgendes geschrieben : | | ich glaube das ist ein handfester Grund für mich endlich mal auf D2009 umzusteigen. |
Ja, um wirklich gut mit Unicode in Delphi zu arbeiten führt an Delphi 2009 kein Weg vorbei. Die dort implementierte Lösung funktioniert gut und ohne das ganze Theater in früheren Versionen.
Zudem ist UnicodeString wie ein AnsiString implementiert ohne COM wie bei WideString, zudem haben UnicodeStrings damit auch eine Referenzzählung wie AnsiStrings.
Die Umstellung macht meistens auch nicht besonders viel Probleme, es sei denn man arbeitet viel direkt zeichenweise mit Strings (oder mit dem Speicherbereich von Strings).
Prinzipiell muss man u.a. überall dort aufpassen, wo man Length(String) als Größe in Byte genommen hat (im Hinblick auf deine Vokabeldateien, deren Format ich mir nicht angeschaut habe). Dort muss man stets Length mit SizeOf(Char) multiplizieren, dann funktioniert das in allen Versionen von Delphi.
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: So 19.07.09 07:16
Ich habe meine Applikation(en) inzw. vollständig auf Delphi 2009 und damit Unicode umgestellt, habe damit aber noch folgende Herausforderung:
- generell funktioniert das mit Unicode sehr gut
- Einige spezielle Schriftzeichen kann ich zwar eingeben (sie werden auch korrekt dargestellt, zB in Memos) aber wenn ich sie als (Text)Datei mit SaveToFile speichere werden sie nicht richtig "abgespeichert". Beim "Einlesen" mit LoadFromFile Sind die urspr. Sonderzeichen dann auch wieder "normale/falsche Zeichen".
Es handelt sich zB um folgende (kroatische) Zeichen: "ćĆčČ", sie werden zu "cCcC"
Hat jemand eine Idee wie ich sich das lösen lässt?
lG Martin
|
|
Seven of Nine 
      
Beiträge: 132
Erhaltene Danke: 1
Win XP, Win Vista HomePro
Delphi 2009
|
Verfasst: Mo 20.07.09 19:12
Ich habe inzw. Hilfe von einem anderem User erhalten die ich hier nicht vorenthalten möchte.
SaveToFile existiert inzw auch als überladende Variante
procedure SaveToFile(const FileName: string); virtual; overload;
procedure SaveToFile(const FileName: string; Encoding: TEncoding); virtual; overload;
Die Klasse TEncoding ist im Helpfile (Beispiel) folgendermaßen vorbelegt
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| EncodingArray[0]:= TEncoding.UTF8; EncodingArray[1]:= TEncoding.UTF7; EncodingArray[2]:= TEncoding.Unicode; EncodingArray[3]:= TEncoding.Default; EncodingArray[4]:= TEncoding.BigEndianUnicode; EncodingArray[5]:= TEncoding.ASCII; |
hieraus vermute das entweder die 1.te Definition "UTF8" oder "Default" standardmässig gesetzt ist.
Da bei mir auch einige nicht ANSI zeichen geschrieben wurde vermute ich eigentlich UTF8
UTF7, UTF8, ASCII ist ja vermutlich jedem klar was es bewirkt. "BigEndianUnicode" ist gemäß Google eine "spezielle Formatierung für Unicode".
Ich verwende jetzt bei mir im Code "Unicode" also
Delphi-Quelltext 1:
| Lines.SaveToFile('C:\Temp\Test.txt', TEncoding.Unicode); |
denke das passt so. Zumindest siehts nach den ersten Tests danach aus
lG Martin
|
|