Autor Beitrag
Seven of Nine
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Fr 12.06.09 10:21 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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)

user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:

- 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 12.06.09 10:34 
user profile iconBernhard Geyer hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.
Stimmt, auf nem sauberen XP ist es nicht drauf, das ist mir gar nicht bewusst gewesen, weil MS Office bei mir zur Standardausstattung gehört. :oops:
Und da ich zudem XP schon eine Weile nicht mehr benutze...

user profile iconBernhard Geyer hat folgendes geschrieben Zum zitierten Posting springen:
ab Vista "Serge?? UI" (hag gerate nur XP)
Segoe UI meinst du vermutlich. ;-)
Seven of Nine Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Fr 12.06.09 21:43 
user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:
@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.

Da ich den Artikel für "Den Entwickler" geschrieben haben wird eine weiterverteilung außerhalb m.W. nicht erlaubt sein. Werde mal nachfragen ob der Verlag diesen Artikel evtl. als Online-Artikel bereitstellen könnnte

user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:

Zum Thema Unicode unter Delphi findet man im Netz ansonsten soviel verwirrendes, teilweise falsches. Und Try&Error ist auch nicht so mein Ding.

Für D2009 hat Nick einige Artikel Online auf Codegear Developer Network bereit gestellt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 13.06.09 00:01 
user profile iconBernhard Geyer hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 13.06.09 11:25 
user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 1

Win XP, Win Vista HomePro
Delphi 2009
BeitragVerfasst: 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
ausblenden 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
ausblenden 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