Informationen für Experten
Anmerkung
In CODESYS-Versionen vor 3.5.18.0 haben Sie nicht die Möglichkeit, UTF-8-kodierte Variablen vom Typ STRING und die Bibliothek Generic String Base zu nutzen. Dies ist erst ab Version 3.5.19.50 möglich. Die anderen Bibliotheken aus dem Package CODESYS String Libraries können Sie trotzdem verwenden. Allerdings ist die Handhabung von UTF-8-kodierten Speicherbereichen (beispielsweise vom Typ ARRAY OF BYTE) dort etwas umständlicher.
VAR
    abyValue : ARRAY[0..33] OF BYTE := [ // UTF-8 CØD€šŸŠ ïß värÿ çôõl
        16#43, 16#C3, 16#98, 16#44, 16#E2, 16#82, 16#AC, 16#C5, 16#A1, 16#C5, 16#B8,
        16#C5, 16#A0, 16#20, 16#C3, 16#AF, 16#C3, 16#9F, 16#20, 16#76, 16#C3, 16#A4,
        16#72, 16#C3, 16#BF, 16#20, 16#C3, 16#A7, 16#C3, 16#B4, 16#C3, 16#B5, 16#6C, 0
    ];
    myString : STR.UTF8Literal := (psValue:=ADR(abyValue));
END_VARSobald UTF8 kodierte Variablen vom Typ STRING verfügbar sind, vereinfacht sich das obige Beispiel weiter:
VAR
    myString : STR.UTF8Literal := (psValue:=ADR(UTF8#'CØD€šŸŠ ïß värÿ çôõl'));
END_VARKonvertierung von STRING zu IString
Die Datenstruktur für die Verwaltung der Eigenschaften eines String-Segments wird über den Funktionsbaustein STR._UTF8String implementiert. Dazu müssen Sie für eine Instanz dieses Bausteins und für das String-Segment selbst Speicher reservieren.
Eine Bausteininstanz muss sich in einem Speicherbereich befinden, der auf einer __XWORD-Adresse ausgerichtet ist.
IStringVAR CONSTANT
    c_udiLength : UDINT := MAX(4, 512); // String segment capacity including terminal NULL
    c_udiXWORD : UDINT := SIZEOF(__XWORD);
    c_udiMaxIndex : UDINT := (SIZEOF(STR._UTF8String) + c_udiLength +  c_udiXWORD  - 1) / c_udiXWORD;
END_VAR
 
VAR
    abyValue : ARRAY[0..33] OF BYTE := [ // UTF-8 CØD€šŸŠ ïß värÿ çôõl
        16#43, 16#C3, 16#98, 16#44, 16#E2, 16#82, 16#AC, 16#C5, 16#A1, 16#C5, 16#B8,
        16#C5, 16#A0, 16#20, 16#C3, 16#AF, 16#C3, 16#9F, 16#20, 16#76, 16#C3, 16#A4,
    16#72, 16#C3, 16#BF, 16#20, 16#C3, 16#A7, 16#C3, 16#B4, 16#C3, 16#B5, 16#6C, 0
	];
    axwMemory : ARRAY[0..c_udiMaxIndex] OF __XWORD;
    udiSize : UDINT;
    itfString : STR.IString := STR.CreateString(
        ADR(axwMemory), SIZEOF(axwMemory),
        ADR(abyValue),
        udiStrSize=>udiSize
    );
    xOk : BOOL;
END_VAR
 
xOk := (
    udiSize >= 512 AND
    itfString.Len() = 33 AND
    STR.RuneCount(itfString) = 20 AND
    itfString.IsValid() AND
    NOT itfString.IsASCII()
);Mit den Hilfsmitteln der Bibliothek Generic String Base werden viele dieser Anforderungen von entsprechenden Bausteinen berücksichtigt und somit dem Anwender viele Aufgaben abgenommen. Vor allem die richtige Reservierung und Ausrichtung der Speicherbereiche sind in den entsprechenden Bausteinen gekapselt.