Informations pour les experts
Note
Dans CODESYS versions antérieures à 3.5.18.0, vous n'avez pas la possibilité d'utiliser des variables codées en UTF-8 de type STRING
et le Generic String Base
bibliothèque. Cela n'est possible qu'à partir de la version 3.5.19.50. Vous pouvez toujours utiliser les autres bibliothèques du CODESYS String Libraries colis. Cependant, la gestion des zones de mémoire codées en UTF-8 (par exemple, ARRAY OF BYTE
) y est un peu plus complexe.
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_VAR
Dès que les variables codées en UTF-8 sont de type STRING
sont disponibles, l'exemple ci-dessus est encore simplifié :
VAR myString : STR.UTF8Literal := (psValue:=ADR(UTF8#'CØD€šŸŠ ïß värÿ çôõl')); END_VAR
Conversion depuis STRING
à IString
La structure de données permettant de gérer les propriétés d'un segment de chaîne est mise en œuvre au moyen du STR._UTF8String
bloc fonctionnel. Pour ce faire, vous devez allouer de la mémoire pour une instance de ce bloc fonctionnel et pour le segment de chaîne lui-même.
Une instance de bloc fonctionnel doit être située dans une zone de mémoire alignée sur __XWORD address
.
IString
VAR 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() );
Avec l'aide du Generic String Base
bibliothèque, bon nombre de ces exigences sont prises en compte par les blocs de fonctions correspondants, libérant ainsi l'utilisateur de nombreuses tâches. Surtout, la réservation et l'alignement corrects de la mémoire sont encapsulés dans les blocs fonctionnels correspondants