This commit is contained in:
2026-09-12 08:56:27 +02:00
parent 426aa92d0d
commit 18306bdc8c
116 changed files with 11080 additions and 0 deletions

View File

@@ -0,0 +1,170 @@
# 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<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 :
```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.
---