# 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 : ```text 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 : ```text byte code unit Unicode scalar code point grapheme cluster ``` Ne pas déclarer implicitement `String : OpIndex` 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 : ```text '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 : ```text "..." 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 : ```text 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 : ```text """ 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 : ```text 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 : ```text 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 : ```text \\ 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 : ```text 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. ---