UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Beitrag von MmVisual »

Hallo ,

Ich habe ein spezielles Problem.
Ein Text mit Sonderzeichen und Umlauten in UTF8, der wird auch korrekt in der Datenbank angezeigt.
Aus diesem Text wird ein Datamatrix Code generiert.
Nun, wenn dieser Code mit einem 2D Codescanner, der als Tastatur Emulation funktioniert, den Code scannt, so wird der Code Bytemäßig mit ALT + NUM Codes übertragen. Lazarus erkennt damit auch jedes einzelne Zeichen und in der "OnFormUTF8KeyPress()" wird dieses jedes einzelne Zeichen entsprechend korrekt dargestellt. Leider weiß an der Stelle Lazarus natürlich nicht dass der empfangene Code Bytemäßig zu interpretieren ist und erst 2 empfangene Zeichen von der Tastatur ergeben dann das richtige echte UTF8 Zeichen.

Nun geht es darum, ich müsste die UTF8 Zeichen irgendwie wieder zurück als Byte-Stream bekommen, aber nicht als UTF8 Byte Stream, sondern als echte Bytes und das dann erst als UTF8 interpretieren. Wenn ich das so mache, dann müsste der empfangene Scan auch das richtige wieder anzeigen.
Mir fehlen gerade die Ideen wie ich das am besten anstelle.
(OnFormKeyPress() funktioniert nicht, da kommen bei den Sonderzeichen nur "?" an, es muss daher OnFormUTF8KeyPress() verwendet werden.)

Text in der Eingabe: "_ SSSSµäöüß|łżóś|€"
Text nach dem Scan: "_ SSSSµäöüß|łżóś|€"

Zur Veranschaulichung Bilder, ich denke mein Problem ist sonst nicht richtig zu verstehen:
Bild1.png
Bild1.png (18.88 KiB) 910 mal betrachtet
Hier habe ich die empfangenen Tasten-Codes aufgezeichnet. "KD" = KeyDown() "KP" = UTF8KeyPress():
Bild2.png
Bild2.png (15.11 KiB) 910 mal betrachtet
Verwendete Scanner: Zebra DS2208.
Im Scanner habe ich ein spezielles Start-Zeichen und Ende Kennung programmiert, daher kann ich den Tastenstrom vom Scanner exakt ausschneiden und entsprechend regieren ohne dass die EXE davon betroffen ist.
Und Zebra ist eines der besten Firmen, die emulieren so ziemlich alles was es auf dem Markt gibt. Viele andere Billigteile können die Steuerzeichen nicht darstellen, die in den 2D Codes verwendet werden. Die "normalen" Buchstaben und Zahlen gehen alle richtig.

Vielen Dank für die Hilfe
Viele Grüße Markus
Zuletzt geändert von MmVisual am Sa 23. Okt 2021, 01:40, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen?

Beitrag von MmVisual »

Ich habe es hin bekommen :D :

Code: Alles auswählen

  sGuess := GuessEncoding(s2DDat);
  sA := ConvertEncoding(s2DDat, sGuess, EncodingAnsi);
  s := PChar(sA);
VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Beitrag von af0815 »

In dem Barcode steht noch mehr drinnen.

Generell Empfehle ich nur 7Bit ANSII im BC/2D zu verwenden. Ansonsten ist man zu sehr auf das was der Drucker und Scanner verträgt angewiesen. Wenn der Kunde dann einen neuen reinen Barcode benötigt, hat man die Arschkarte. Nur so eine Erfahrung aus der Praxis.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Beitrag von MmVisual »

Ich muss 2D Codes im Format "EIGP-114.2018" auswerten können, das ist schon eine gewisse Herausforderung, da die billigscanner nicht alle Steuerzeichen übertragen können.

Hier das Dokument in dem der Aufbau vom 2D Code spezifiziert ist, insbesondere Seite 29 in dem die Zeichen "RS", "GS" und "EOT" drin sind. Ich habe einige Scanner in der Hand gehabt, die meisten hatten mit dem "GS" Zeichen ein Problem und damit konnte ich die einzelnen Datenfelder nicht mehr auseinander halten.

https://www.ecianow.org/assets/docs/GIP ... arcode.pdf

Und da ich diese Labels hauptsächlich für Elektronik benötige und das "µ" Zeichen man für die ganzen Kondensatoren benötigt ist mir vor kurzem aufgefallen dass da das Lesen nicht wirklich geklappt hat. Also bei den Labels die meine Software druckt und auch Labels die über einen Webbrowser von diversen Datamatrix Code Generatoren erzeugt werden, war das "µ" Zeichen immer das gleiche Problem.
Und da das so toll mit "ordentlichen" Scannern und Lazarus funktioniert habe ich dem Scanner als Prefix ein "SOH" und als Suffix ein "EOT" einprogrammiert, damit kann die EXE den Scan sehr schön herausschneiden im OnFormUTF8KeyPress().

Die 2D Scan Funktion habe ich für meine Software auch gut dokumentiert, da steht auch drin dass Umlaute und Sonderzeichen nicht verwendet werden sollten:
http://www.mmvisual.de/Hilfe/EleLa/2DCode.htm

VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Beitrag von af0815 »

Danke für die Infos. Das Dokument über den Aufbau kannte ich nicht, könnte für die Autoindustrie aber interesannter werden, nachdem das ja langsam Computer mit Rädern werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MmVisual
Beiträge: 1445
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: UTF8 String in Byte wandeln um daraus UTF8 zu erzeugen? [gelöst]

Beitrag von MmVisual »

Diese Codes drucken heute schon DigiKey/Farnell/Mouser auf ihre Tütchen.
Damit lässt sich dann supereinfach die Lagerbuchung bei Anlieferung bewerkstelligen oder das Bestücken der Bauteile auf der Platine. Man scannt einfach und EleLa springt zum Datensatz.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten