AGB  ·  Datenschutz  ·  Impressum  







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

Unicode strings

Offene Frage von "p80286"
Ein Thema von eric_draven · begonnen am 8. Aug 2014 · letzter Beitrag vom 9. Aug 2014
Antwort Antwort
Patito

Registriert seit: 8. Sep 2006
108 Beiträge
 
#1

AW: Unicode strings

  Alt 8. Aug 2014, 14:34
Hallo,

in einigen Projekten (Delphi7-2005) benutze ich strings für hardwarenahe Kommunikation. Dies hat für mich einige Vorteile gegenüber z.B. Byte Arrays, da Teilstrings als Konstanten hinterlegt werden können oder mal eben testweise schnell eingegeben, etc.
Leider führt dies durch Unicode in neuer Versionen zu Problemen, da ich bisher keinen reinen ByteString Typ gefunden hab.
Beispiel:
bisher:

...
...Send(HEADER + #$01#$02 + 'abc' + #12 + Data);
...

Hat jemand eine Idee, wie ich das mit einer aktuellen Delphi Version (XEn) ähnlich umsetzen kann ? Mit RawByteString, Codepages, etc. hatte ich bisher keinen Erfolg.
Als ich früher solche Fragen gestellt habe, lagen die Statements von diversen Delphi-Leuten
irgendwo zwischen "So etwas sollte man nicht machen" und grobem Unverständnis.

Ein Problem hier kann z.B. sein, dass Konstanten wie #$01 nich das liefern, was Du erwartest.
So etwas wird schon mal stillschweigend in andere Char-Codierungen umgewandelt.

Mein Tip: Mach einen Bogen um die XEs.

Mit etwas Geduld und Gewalt kriegt man soetwas bestimmt irgendwie hin. Aber Arbeitszeit aufzuwenden um die ganzen
Absonderlichkeiten von einem Tool zu verstehen, dessen Entwickler es für eine tolle Idee halten den Support für
AnsiStrings einzuschränken (bzw. planen ihn in Zukunft auch mal ganz zu entfernen) ist einfach nicht sinnvoll.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Unicode strings

  Alt 8. Aug 2014, 15:03
#$01 entspricht dem #1 und alles im ASCII-Bereich (#0 bis #127) ist in allen Kodierungen gleich, womit das niemals eine Veränderung erfahren sollte.
Die #0 muß zwar beachtet werden, aber der String selber kann solche Zeichen problemlos behandeln, solange man nicht fahrlässig mit PChar-Funktionen, ohne Längenangabe, rumhantiert.

Wie ist denn das Send deklaiert? (mit String-Parameter?)


Wo man etwas aufpassen muß, ist z.B. bei #$0085 und #$85 oder #133, denn bei Erstem geht Delphi davon aus, daß es Unicode ist und beim Letzen kann es als ANSI behandelt werden und erfährt dann eventuell eine Konvertierung nach Unicode.
Rein logisch ist es zwar das Selbe, aber der Compiler achtet halt auf sowas.



Aus soeinem Grund hab ich grade eine Serial-Port-Komponente komplett neu aufgesetzt, bzw. bin noch dabei.
Die ist von der Schnittstelle der vom C# ähnlich, mit Anpassungen an Delphi und diese String-Probleme, einer internen explizit steuerbaren String-Konvertierung und mit Erweiterungen anhand der zusätzlichen Möglichkeiten der WinAPI. (und später hoffentlich auch noch für iOS und vorallem für Android)
Wobei ich absichtlich auch TBytes unterstütze, um das String-Konvertierungs-Problem ganz auszuschließen.

Wobei iOS/Android noch Spaß machen wird, denn dort gibt es keinen AnsiString mehr ... nur noch Unicode.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 8. Aug 2014 um 15:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Unicode strings

  Alt 8. Aug 2014, 23:07
Als ich früher solche Fragen gestellt habe, lagen die Statements von diversen Delphi-Leuten
irgendwo zwischen "So etwas sollte man nicht machen" und grobem Unverständnis.
So wie oben macht man es ja auch nicht. Hier wäre sinnvoll das was man als OSI-Modell kennt auch entsprechend auf Klassen aufzuteilen und nicht den ganzen Packetaufbau so zusammenzufassen.
Hat man entsprechende Klassen/Helperunits muss man sich um Charactercodierung nur an wenigen Stellen Quellcode Gedanken machen.

Ein Problem hier kann z.B. sein, dass Konstanten wie #$01 nich das liefern, was Du erwartest.
So etwas wird schon mal stillschweigend in andere Char-Codierungen umgewandelt.
Eigentlich nicht. $01 ist immer $01. Egal welche Codierung. Jedoch kann es sein wenn man sowas an WinAPI-Funktionen übergibt die Strings erwarten das hier diese Sonderzeichen verstümmelt werden weil die Funktion nur Druckbare Zeichen erwartet. Hatte erst vor kurzen den Fall das ein Unicodezeichen kein richtiges Zeichen war und UTF8-Codiert eine defekte XML-Datei produziert hatte.

Mein Tip: Mach einen Bogen um die XEs.
Mein Tipp. Ist nicht nötig. Die XEs sind sehr gut zu verwenden.

Mit etwas Geduld und Gewalt kriegt man soetwas bestimmt irgendwie hin.
Da braucht man keine Gewalt. Man muss nur verstehen wie Strings Funktionieren und schon funktioniert es in 99% aller Fälle auf Anhieb.

Aber Arbeitszeit aufzuwenden um die ganzen Absonderlichkeiten von einem Tool zu verstehen,
dessen Entwickler es für eine tolle Idee halten den Support für AnsiStrings einzuschränken
(bzw. planen ihn in Zukunft auch mal ganz zu entfernen) ist einfach nicht sinnvoll.
Wenn Du meinst. Man brauche eigentlich in 99% der Fälle keine AnsiStrings. Man muss nur Wissen wie man Daten einlist (Stichworte BOM, Konvertierungsfunktionen, ...) und wie man Sie ausgibt.
Glücklicherweise hat Emba/Delphi den Weg genommen mit Unicodestrings zu arbeiten statt hier eine Krückenlösung ala FreePascal mit UTF8 zu realisieren.
Da wo man sich Delphi XEx keine Gedanken mehr machen muss bezüglich Dateizugriff und Sonderzeichen in Dateinamen, muss man bei Freepascal noch überlegen ob man nun die Funktion mit oder ohne UTF8/native im Namen verwendet.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Unicode strings

  Alt 9. Aug 2014, 01:48
Als ich früher solche Fragen gestellt habe, lagen die Statements von diversen Delphi-Leuten
irgendwo zwischen "So etwas sollte man nicht machen" und grobem Unverständnis.
Das kannst Du gerne haben. Char/String ist im 8-Bit Bereich oft eine Frage der Interpretation, einzig 0..9,A..Z und a..z und das Blank sind überall (soweit ich weiß) gleich. Sonderzeichen und Umlaute sind mehr oder weniger frei verteilt, ganz zu schweigen von den TTY-Steuerzeichen. Wenn man schon mit Char/String arbeiten will/muß dann sollte man schon wissen, was die Umgebungsvariablen (Codepage, Zeichensatz, Font) sind. Im Zweifel sollten immer numerische Werte (Byte) übergeben werden. Nicht umsonst werden z.B. die PCL-Steuersequenzen als Byte-Folgen angegeben.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 02:26 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 by Thomas Breitkreuz