TIA UTF-8 zu ASCII konvertieren

DCDCDC

Level-3
Beiträge
1.735
Reaktionspunkte
366
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

TIA Portal V18 Update 2


Ich bekomme vom MQTT Broker UTF-8 kodierte Nachrichten, im JSON Format gesendet.

Es gibt einen Baustein in der MQTT Bibliothek von Siemens welcher ein Array of Byte in ein UTF-8 kodiertes Array of Byte konvertiert. (LMQTT_ConvertToUtf8)

Zum Nachrichten senden gehe ich so vor: JSON Tree -> JSON data stream (ASCII) -> MQTT data stream (UTF-8)
Für empfangene Nachrichten würde ich genau anders herum vorgehen und da kommt auch schon meine Frage ins Spiel.

Ich hab jetzt nicht direkt in Bibliotheken von Siemens eine Funktion für UTF-8 -> ASCII gefunden.

Der UTF-8 Zeichensatz ist ja größer, als der von ASCII, das bezieht sich auf Sonderzeichen etc (meiner Kenntnis nach).

Da wir keine Sonderzeichen (aktuell) in unseren Nachrichten verwenden, könnte ich die Konvertierung auch sein lassen, möchte ich aber nicht, um solche Fälle abzufangen. Es gibt von Siemens einen Baustein, welcher einen UTF-8 kodierten data stream in einen WString konvertiert.

Hat denn jemand eine Idee wie ich die Konvertierung von UTF-8 nach ASCII elegant gelöst bekommen könnte?

Dankeschön!
 
Der UTF-8 Zeichensatz ist ja größer, als der von ASCII, das bezieht sich auf Sonderzeichen etc (meiner Kenntnis nach).
Wenn man alles als SonderZeichen einstuft, was nicht in ASCII enthalten ist: ja.
Aber, in diesem Sinne sind auch Buchstaben diverser Sprachen (z.B. Griechisch), Buchstaben mit Umlauten, Buchstaben mit Akzenten u.s.w. SonderZeichen.
Da wir keine Sonderzeichen (aktuell) in unseren Nachrichten verwenden, könnte ich die Konvertierung auch sein lassen, möchte ich aber nicht, um solche Fälle abzufangen. Es gibt von Siemens einen Baustein, welcher einen UTF-8 kodierten data stream in einen WString konvertiert.
Der Umweg UTF-8 --> WSTRING --> ASCII entschärft das "eigentliche" Problem nicht wirklich, sondern vereinfacht allenfalls die Umwandlung in Zeichen des erweiterten ASCII-Codes.
Hat denn jemand eine Idee wie ich die Konvertierung von UTF-8 nach ASCII elegant gelöst bekommen könnte?
Überhaupt nicht (wenn Zeichen zu konvertieren sind, die nicht im erweiterten ASCII-Code enthalten sind) und elegant auch nicht.
Das ist so, als wolle man eine "Konvertierung" von z.B. DINT in INT realisieren. Einiges kann man problemlos "konvertieren", den Rest gar nicht, was dann zu einer FehlerMeldung bzw. einer geeigneten FehlerBehandlung führen müsste/sollte.
Die Konvertierung DINT --> INT ist allerdings einleuchtender als UTF-8 --> ASCII.

Bei UTF-8 gibt es ASCII-Bytes, Start-Bytes und Folge-Bytes, wobei
- ASCII-Bytes alle mit 0 beginnen, also 0xxxxxxx,
- StartBytes alle mit 11 beginnen, also 110xxxxx oder 1110xxxx oder 11110xxx (oder 111110xx oder 1111110x) und
- Folge-Bytes alle mit 10 beginnen, also 10xxxxxx.
Bei Start-Bytes gibt übrigens die Anzahl der Einsen vor der ersten Null an, vieviele Bytes insgesamt zum Zeichen gehören, also das Start-Byte plus der Anzahl Folge-Bytes folgen.
Wenn man also weiss, dass es sich um die UTF-8-Codierung handelt, kann man den einzelnen Bytes ansehen, ob sie ASCII-Zeichen darstellen und unverändert bleiben oder, ob man eines von mehreren zusammengehörenden Bytes für ein Zeichen vor sich hat. Im letzteren Fall kann man Glück haben, dass es sich um ein Zeichen des erweiterten ASCII-Codes handelt oder Pech haben, dass es nicht so ist und somit das Zeichen nicht übersetzt werden kann.
 
Zurück
Oben