6.6 KiB
21. Strings, Unicode et encodages
21.1 String — V1 REQUIS — FIGÉ EN PRINCIPE
String est le type ordinaire de texte Unicode.
La représentation interne peut varier suivant le backend/target, mais la sémantique observable doit rester identique.
21.2 Encodages explicites — V1 REQUIS — DIRECTION FIGÉE
Les encodages explicites appartiennent au SDK, pas au langage :
Utf8String
Utf16String
Utf32String
AsciiString éventuel
Bytes
Les conversions avec String doivent être explicites et définies.
21.3 Indexation String — V1 REQUIS — À FINALISER
Il faut décider avant V1 ce que signifie l'accès au texte :
byte
code unit
Unicode scalar
code point
grapheme cluster
Ne pas déclarer implicitement String : OpIndex<uint64,char> avant cette décision.
21.4 char — V1 REQUIS — FIGÉ
char représente exactement un Unicode scalar value, et non un octet, une unité UTF-8/UTF-16 ou un grapheme utilisateur complet.
Exemples valides :
'A'
'é'
'中'
'😀'
'\n'
'\u{1F600}'
Après traitement des escapes, un littéral char doit contenir exactement un scalar. '', 'ab' ou une séquence produisant plusieurs scalars sont invalides.
Saselang n'effectue aucune normalisation Unicode implicite des littéraux ; NFC/NFD et autres transformations relèvent d'opérations explicites de bibliothèque.
21.5 Familles de littéraux texte — V1 REQUIS / RÉSERVÉ
Les familles suivantes sont reconnues ou réservées parce qu'elles représentent des sémantiques distinctes et non des alias gratuits :
"..." String normale, escapes actifs
"""...""" String normale multiligne
r"..." String brute
r"""...""" String brute multiligne
i"..." String interpolée
i"""...""" String interpolée multiligne
ir"..." interpolation + contenu brut, réservé
b"..." bytes, réservé
br"..." bytes bruts, réservé
u8"..." texte encodé UTF-8 explicitement, réservé
u16"..." texte encodé UTF-16 explicitement, réservé
u32"..." texte encodé UTF-32 explicitement, réservé
c"..." chaîne compatible C, réservé
cr"..." chaîne C brute, réservé
t"..." template structuré, réservé
V1 doit au minimum couvrir les formes normales, multilignes, raw et interpolées. Les formes bytes, encodages explicites, C string, template et certaines combinaisons peuvent être implémentées en V2 mais leur espace lexical est réservé dès V1.
Les préfixes de littéraux ne sont pas nécessairement des mots-clés globaux : ils sont reconnus comme préfixes lorsqu'ils sont immédiatement contigus au délimiteur correspondant.
Les combinaisons de préfixes ne sont pas arbitraires. Une matrice normative ultérieure doit classer chaque combinaison comme supported, reserved ou forbidden/meaningless, et retenir une seule orthographe canonique par combinaison. Des doublons tels que ir et ri pour une même sémantique ne coexistent pas.
La forme interpolée i"..." est réservée, mais le délimiteur interne de l'expression reste V1 REQUIS — À FINALISER entre :
i"Hello {name}"
i"Hello ${name}"
Une seule de ces deux formes sera retenue comme syntaxe canonique. Une String non préfixée n'interprète jamais ces séquences comme interpolation.
21.6 Chaînes multilignes — V1 REQUIS — FIGÉ
Les triples quotes fournissent la forme multiligne :
"""
first
second
"""
Le délimiteur de fermeture détermine l'indentation structurelle à retirer de chaque ligne. Une indentation supplémentaire volontaire dans le contenu est conservée.
Lorsque """ d'ouverture est immédiatement suivi d'un retour à la ligne, ce premier retour structurel n'appartient pas à la valeur. Lorsque le délimiteur de fermeture se trouve seul après l'indentation structurelle d'une nouvelle ligne, le dernier retour structurel est également supprimé.
La même règle de lignes et d'indentation s'applique aux variantes normales, raw et interpolées. Le caractère raw ou interpolé modifie le traitement du contenu, pas la structure multiligne.
Le formatter peut réindenter la structure source uniquement en préservant exactement la valeur sémantique du littéral.
21.7 Raw strings et délimiteurs — V1 REQUIS — FIGÉ
La forme raw utilise un préfixe r contigu et peut employer zéro ou plusieurs # comme partie du délimiteur :
r"simple"
r#"He said "hello"."#
r##"contains "# inside"##
La fermeture reprend exactement le même nombre de # que l'ouverture. Aucun escape n'est interprété dans le contenu raw.
La même mécanique est disponible pour les triples quotes :
r"""..."""
r#"""..."""#
Les # appartiennent au délimiteur lexical et ne sont pas des escapes. Les variantes combinées réservées telles que ir, br ou cr suivent le même principe lorsqu'elles seront activées.
Une borne d'implémentation raisonnable au nombre de # peut être imposée, à condition d'être documentée et diagnostiquée explicitement ; cette borne n'est pas encore normative.
raw est une propriété lexicale et ne change pas à elle seule le type résultat.
21.8 Escapes normaux — V1 REQUIS — FIGÉ
Dans les String normales et les char, l'ensemble canonique est :
\\ backslash
\" double quote
\' single quote
\n newline
\r carriage return
\t horizontal tab
\0 NUL
\u{...} Unicode scalar
\u{...} contient de 1 à 6 chiffres hexadécimaux, n'accepte pas _, doit être inférieur ou égal à 0x10FFFF et ne peut pas désigner la plage surrogate UTF-16 0xD800..0xDFFF.
Saselang n'introduit pas les alias historiques redondants \uXXXX, \UXXXXXXXX, les escapes octaux ou les control aliases C rares lorsque \u{...} couvre déjà leur besoin.
\xNN est réservé aux littéraux orientés octets, notamment b"...", où il représente exactement un octet avec exactement deux chiffres hexadécimaux :
b"\x00\x7f\x80\xff"
\xNN est interdit dans une String Unicode normale et dans char.
21.9 Unicode et représentation — V1 REQUIS — FIGÉ EN PRINCIPE
Le fichier source UTF-8 peut contenir directement des scalars Unicode valides dans String, char, commentaires et Saseldoc. Une séquence UTF-8 invalide est une erreur de source ; le compilateur ne la répare pas silencieusement.
La représentation physique interne de String reste indépendante de cette syntaxe source et peut varier selon backend/target conformément à la section 21.1.