v0.2.12
This commit is contained in:
170
chapters/021-strings-unicode-et-encodages.md
Normal file
170
chapters/021-strings-unicode-et-encodages.md
Normal 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.
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user