{
  "chapter": {
    "id": "representation-texte",
    "level": "premiere",
    "theme": "Représentation des données",
    "title": "Représentation du texte",
    "description": "Codage des caractères (ASCII, ASCII étendu, Unicode), normes UTF-8,\nUTF-16, UTF-32, fonctions Python `ord` et `chr`, et formats de texte\nenrichi (HTML, XML, RTF, OpenDocument, TeX).",
    "parties": [
      {
        "id": "ascii",
        "title": "ASCII et codage des caractères"
      },
      {
        "id": "unicode",
        "title": "Unicode, UTF-8 et taille des fichiers"
      },
      {
        "id": "python",
        "title": "Manipuler du texte en Python"
      }
    ],
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "ascii",
        "definition"
      ],
      "title": "Définition d'ASCII",
      "partie": "ascii",
      "statement": "Que signifie le sigle **ASCII** ?",
      "options": [
        {
          "text": "Architecture Standard pour Calculs et Instructions Internes",
          "correct": false,
          "feedback": "Erreur : ASCII n'est pas lié à l'architecture des\nprocesseurs. C'est une table de codage de caractères.\n"
        },
        {
          "text": "Algorithme Standard pour la Compression d'Images",
          "correct": false,
          "feedback": "Erreur : ASCII concerne le codage de caractères, pas la\ncompression d'images.\n"
        },
        {
          "text": "American Standard Code for Information Interchange",
          "correct": true,
          "feedback": "Bonne réponse : c'est le code historique américain pour\nreprésenter les caractères texte. Il a été conçu pour\nl'anglais, ce qui explique l'absence des accents.\n"
        },
        {
          "text": "Acronyme Standard de Compatibilité Inter-Systèmes",
          "correct": false,
          "feedback": "Erreur : sigle inventé. La signification réelle commence\npar « American Standard Code... ».\n"
        }
      ],
      "explanation": "Le code ASCII est apparu en $1963$ aux États-Unis. Il est conçu\npour l'anglais et ne contient aucun caractère accentué, ce qui\na motivé l'apparition d'extensions et de normes plus\nuniverselles."
    },
    {
      "id": "q02",
      "difficulty": 1,
      "skills": [
        "ascii",
        "taille"
      ],
      "title": "Taille de la table ASCII standard",
      "partie": "ascii",
      "statement": "Combien de caractères différents peut-on coder avec l'ASCII\nstandard (sur sept bits) ?",
      "options": [
        {
          "text": "$512$",
          "correct": false,
          "feedback": "Erreur : aucune table de caractères usuelle ne fait\n$512$ entrées. ASCII fait $128$, les extensions $256$,\nUnicode plus d'un million.\n"
        },
        {
          "text": "$64$",
          "correct": false,
          "feedback": "Erreur : c'est $2^6$, donc le nombre de codes possibles\nsur **six** bits. ASCII utilise sept bits.\n"
        },
        {
          "text": "$256$",
          "correct": false,
          "feedback": "Erreur : c'est la taille des **extensions** ASCII (sur\nhuit bits). L'ASCII standard tient sur sept bits.\n"
        },
        {
          "text": "$128$",
          "correct": true,
          "feedback": "Bonne réponse : sur $7$ bits, on a $2^7 = 128$ codes\npossibles, soit autant de caractères représentables. En\npratique, ASCII n'en utilise que $95$ imprimables et $33$\nde contrôle.\n"
        }
      ],
      "explanation": "Bien que l'ASCII tienne sur $7$ bits, on le stocke en pratique\nsur un octet ($8$ bits), avec le bit de poids fort à $0$. Le\nhuitième bit a permis plus tard de définir des extensions à\n$256$ caractères (ASCII étendu, Latin-$1$, etc.)."
    },
    {
      "id": "q03",
      "difficulty": 1,
      "skills": [
        "python",
        "ord"
      ],
      "title": "Code ASCII de la lettre 'A'",
      "partie": "python",
      "statement": "En Python, que renvoie l'expression `ord('A')` ?",
      "options": [
        {
          "text": "$32$",
          "correct": false,
          "feedback": "Erreur : $32$ est le code de l'espace en ASCII, pas de la\nlettre A.\n"
        },
        {
          "text": "$1$",
          "correct": false,
          "feedback": "Erreur : confusion possible avec la position de A dans\nl'alphabet. Or `ord` renvoie le **code ASCII** (ou point\nde code Unicode), pas la position.\n"
        },
        {
          "text": "$65$",
          "correct": true,
          "feedback": "Bonne réponse : la lettre A majuscule a le code ASCII $65$.\nLes majuscules suivantes sont consécutives : B vaut $66$,\nC vaut $67$, etc.\n"
        },
        {
          "text": "$97$",
          "correct": false,
          "feedback": "Erreur : $97$ est le code de **a** minuscule. Les\nmajuscules et minuscules ont des codes différents en ASCII.\n"
        }
      ],
      "explanation": "Mémo utile : A vaut $65$, $a$ vaut $97$. La différence est $32$,\nce qui correspond au bit $5$ qui distingue majuscule et\nminuscule en ASCII."
    },
    {
      "id": "q04",
      "difficulty": 1,
      "skills": [
        "python",
        "chr"
      ],
      "title": "Fonction `chr` en Python",
      "partie": "python",
      "statement": "Quelle est la valeur renvoyée par `chr(66)` en Python ?",
      "options": [
        {
          "text": "`'B'`",
          "correct": true,
          "feedback": "Bonne réponse : $66$ est le code ASCII de la lettre B.\n"
        },
        {
          "text": "`66`",
          "correct": false,
          "feedback": "Erreur : `chr` renvoie un caractère (chaîne de longueur\n$1$), pas un entier. C'est `ord` qui fait la conversion\ninverse.\n"
        },
        {
          "text": "`'b'`",
          "correct": false,
          "feedback": "Erreur : `'b'` correspond à `chr(98)`, pas $66$.\n"
        },
        {
          "text": "`'A'`",
          "correct": false,
          "feedback": "Erreur : `'A'` correspond à `chr(65)`, pas $66$.\n"
        }
      ],
      "explanation": "Les fonctions `ord` et `chr` sont inverses l'une de l'autre :\n`chr(ord(c)) == c` et `ord(chr(n)) == n` pour tout caractère\n`c` et tout code valide `n`."
    },
    {
      "id": "q05",
      "difficulty": 1,
      "skills": [
        "unicode",
        "point-de-code"
      ],
      "title": "Ce qu'Unicode associe à un caractère",
      "partie": "unicode",
      "statement": "Qu'est-ce qu'Unicode associe à chaque caractère, par exemple à la lettre `é` ?",
      "options": [
        {
          "text": "Une suite d'octets identique dans tous les fichiers",
          "correct": false,
          "feedback": "Erreur : les octets dépendent de l'encodage choisi. Le même `é` s'écrit sur un octet en ISO-8859-1 et sur deux octets en UTF-8 ; ce qui ne change pas, c'est son numéro Unicode.\n"
        },
        {
          "text": "Un numéro unique, indépendant de l'écriture en octets",
          "correct": true,
          "feedback": "Bonne réponse : ce numéro s'appelle le point de code, $233$ pour `é`. Les encodages comme UTF-8 indiquent ensuite comment écrire ce numéro sous forme d'octets.\n"
        },
        {
          "text": "Le dessin de la lettre, commun à toutes les polices",
          "correct": false,
          "feedback": "Erreur : le dessin d'une lettre dépend de la police utilisée. Unicode identifie le caractère lui-même, pas son apparence à l'écran.\n"
        },
        {
          "text": "Un code sur $7$ bits, comme en ASCII",
          "correct": false,
          "feedback": "Erreur : $7$ bits ne donnent que $128$ codes, alors qu'Unicode recense des dizaines de milliers de caractères. Ses numéros vont bien au-delà de $127$.\n"
        }
      ],
      "explanation": "Unicode sépare deux questions : quel numéro, ou point de code, désigne chaque caractère, et comment l'écrire en octets. La seconde question relève des encodages comme UTF-8, qui peuvent écrire différemment un même point de code."
    },
    {
      "id": "q06",
      "difficulty": 1,
      "skills": [
        "utf",
        "definition"
      ],
      "title": "Caractéristique principale d'UTF-8",
      "partie": "unicode",
      "statement": "Pourquoi UTF-$8$ est-il l'encodage le plus répandu sur le web ?",
      "options": [
        {
          "text": "Parce qu'il code tous les caractères sur un seul octet",
          "correct": false,
          "feedback": "Erreur : UTF-$8$ est un codage à **taille variable** ($1$ à\n$4$ octets selon le caractère). Il code l'ASCII sur un\nseul octet, mais pas tous les caractères.\n"
        },
        {
          "text": "Parce qu'il a complètement remplacé Unicode",
          "correct": false,
          "feedback": "Erreur : UTF-$8$ est **un encodage** de la norme Unicode,\npas son remplaçant. Unicode définit les points de code,\nUTF-$8$ définit comment les sérialiser en octets.\n"
        },
        {
          "text": "Rétro-compatible avec ASCII et de taille variable",
          "correct": true,
          "feedback": "Bonne réponse : un fichier ASCII pur est déjà un fichier\nUTF-$8$ valide. Pour les caractères non ASCII (accents,\nidéogrammes, emojis, etc.), UTF-$8$ utilise plusieurs\noctets, ce qui économise de l'espace pour les langues\nlatines.\n"
        },
        {
          "text": "Parce qu'il code tous les caractères sur exactement deux octets",
          "correct": false,
          "feedback": "Erreur : c'est plutôt UTF-$16$ qui utilise un ou deux mots\nde $16$ bits. UTF-$8$ est plus économique en pratique.\n"
        }
      ],
      "explanation": "UTF-$8$ utilise $1$ octet pour les caractères ASCII (codes\nU+$0000$ à U+$007$F), $2$ pour la plupart des langues\neuropéennes, $3$ pour les autres alphabets et idéogrammes\ncourants, et $4$ pour les caractères rares et les emojis."
    },
    {
      "id": "q07",
      "difficulty": 1,
      "skills": [
        "unicode",
        "taille"
      ],
      "title": "Nombre de caractères Unicode",
      "partie": "unicode",
      "statement": "Environ combien de caractères différents la norme Unicode\npeut-elle référencer ?",
      "options": [
        {
          "text": "$256$",
          "correct": false,
          "feedback": "Erreur : $256$ correspond aux codes ASCII étendus (huit\nbits), pas à Unicode.\n"
        },
        {
          "text": "$128$",
          "correct": false,
          "feedback": "Erreur : $128$ est la taille de l'ASCII standard, pas\nd'Unicode. Unicode est une norme bien plus vaste.\n"
        },
        {
          "text": "$65\\ 536$",
          "correct": false,
          "feedback": "Erreur : c'est la limite d'UTF-$16$ sur un seul mot\n($2^{16}$). Unicode dépasse cette limite, ce qui oblige\nUTF-$16$ à utiliser deux mots pour les caractères rares.\n"
        },
        {
          "text": "$1\\ 114\\ 112$",
          "correct": true,
          "feedback": "Bonne réponse : Unicode peut référencer un peu plus d'un\nmillion de points de code (de `U+0000` à `U+10FFFF`).\nEnviron $150\\ 000$ sont actuellement attribués.\n"
        }
      ],
      "explanation": "Le but d'Unicode est de couvrir **tous** les systèmes\nd'écriture du monde, y compris les langues anciennes, les\nalphabets phonétiques, les symboles mathématiques et les\nemojis. La norme évolue régulièrement avec de nouveaux\ncaractères."
    },
    {
      "id": "q08",
      "difficulty": 1,
      "skills": [
        "ascii",
        "casse"
      ],
      "title": "Différence majuscule / minuscule en ASCII",
      "partie": "ascii",
      "statement": "Quelle est la différence entre le code ASCII d'une lettre\nmajuscule et celui de la même lettre en minuscule ?",
      "options": [
        {
          "text": "$1$",
          "correct": false,
          "feedback": "Erreur : la différence est plus grande. Par exemple\n$\\text{ord}('A') = 65$ et $\\text{ord}('a') = 97$.\n"
        },
        {
          "text": "$32$",
          "correct": true,
          "feedback": "Bonne réponse : minuscule = majuscule + $32$. C'est\nprécisément la valeur du sixième bit ($2^5$). Cela permet\nen pratique de basculer entre les deux casses en\ninversant ce bit.\n"
        },
        {
          "text": "$65$",
          "correct": false,
          "feedback": "Erreur : $65$ est le code ASCII de A, pas la différence\nentre majuscule et minuscule.\n"
        },
        {
          "text": "$26$",
          "correct": false,
          "feedback": "Erreur : $26$ est le nombre de lettres de l'alphabet, pas\nla différence des codes ASCII.\n"
        }
      ],
      "explanation": "Cette propriété vient de l'organisation de la table : les minuscules suivent les majuscules dans le même ordre, décalées de $32$, soit $2^5$. Pour changer la casse d'une lettre, il suffit donc d'ajouter ou de retirer $32$ à son code."
    },
    {
      "id": "q09",
      "difficulty": 1,
      "skills": [
        "enrichi",
        "balises"
      ],
      "title": "Texte enrichi vs texte simple",
      "partie": "unicode",
      "statement": "Qu'est-ce qui distingue un **texte enrichi** d'un texte simple ?",
      "options": [
        {
          "text": "Le texte enrichi ajoute la mise en forme",
          "correct": true,
          "feedback": "Bonne réponse : le texte simple est une simple suite de\ncaractères ; le texte enrichi y ajoute des balises ou des\ninformations de typographie pour gérer la mise en page,\nles liens, les images, etc.\n"
        },
        {
          "text": "Le texte enrichi est forcément en couleur",
          "correct": false,
          "feedback": "Erreur : la couleur n'est qu'une des nombreuses\ninformations qu'un texte enrichi peut contenir, mais elle\nn'est pas obligatoire.\n"
        },
        {
          "text": "Le texte enrichi est plus long",
          "correct": false,
          "feedback": "Erreur : la longueur ne distingue pas les deux. Un texte\nenrichi peut être très court.\n"
        },
        {
          "text": "Le texte enrichi est forcément codé en Unicode",
          "correct": false,
          "feedback": "Erreur : tout codage de caractères est utilisable. La\ndifférence est la présence d'informations de mise en forme.\n"
        }
      ],
      "explanation": "Exemples de formats enrichis : HTML, XML, RTF, OpenDocument,\nLaTeX, Markdown. Tous reposent sur le principe de\n**balises** ou de marqueurs spéciaux ajoutés autour du texte."
    },
    {
      "id": "q10",
      "difficulty": 1,
      "skills": [
        "python",
        "chr",
        "ord"
      ],
      "title": "Obtenir un caractère à partir de son code",
      "partie": "python",
      "statement": "En Python, quelle expression renvoie le caractère dont le\ncode ASCII est $65$ ?",
      "options": [
        {
          "text": "`str(65)`",
          "correct": false,
          "feedback": "Erreur : `str(65)` convertit le nombre en la chaîne\n`'65'`, formée des deux caractères `'6'` et `'5'` ; la\ntable des codes n'est pas consultée.\n"
        },
        {
          "text": "`chr(65)`",
          "correct": true,
          "feedback": "Bonne réponse : `chr` reçoit un code (un entier) et\nrenvoie le caractère correspondant, ici `'A'`. C'est la\nfonction réciproque de `ord`.\n"
        },
        {
          "text": "`ord(65)`",
          "correct": false,
          "feedback": "Erreur : `ord` fait le chemin inverse, du caractère vers\nson code ; appliquée à un entier, elle lève `TypeError`.\n"
        },
        {
          "text": "`char(65)`",
          "correct": false,
          "feedback": "Erreur : il n'existe pas de fonction `char` en Python ;\nl'appel lève `NameError`.\n"
        }
      ],
      "explanation": "`ord` et `chr` sont réciproques : `ord('A')` vaut $65$ et\n`chr(65)` vaut `'A'`. Il ne faut pas confondre `chr(65)`,\nqui donne le caractère de code $65$, avec `str(65)`, qui\nécrit simplement le nombre $65$ sous forme de chaîne."
    },
    {
      "id": "q11",
      "difficulty": 2,
      "skills": [
        "conversion",
        "ascii"
      ],
      "title": "Représentation binaire d'un caractère",
      "partie": "python",
      "statement": "Quelle est la représentation binaire (sur huit bits) du\ncaractère 'A' en ASCII ?",
      "options": [
        {
          "text": "$00000001$",
          "correct": false,
          "feedback": "Erreur : c'est le code $1$, le rang de A dans\nl'alphabet. En ASCII, ce code correspond à un caractère\nde contrôle, pas à une lettre.\n"
        },
        {
          "text": "$01100001$",
          "correct": false,
          "feedback": "Erreur : c'est le code $97 = 65 + 32$, qui correspond\nà 'a' minuscule, pas 'A' majuscule.\n"
        },
        {
          "text": "$01000001$",
          "correct": true,
          "feedback": "Bonne réponse : $\\text{ord}('A') = 65 = 64 + 1 = 2^6 + 2^0$,\nsoit $01000001_2$ sur huit bits.\n"
        },
        {
          "text": "$10000001$",
          "correct": false,
          "feedback": "Erreur : ce code ($129$) sort de la table ASCII standard.\nDe plus, le bit de poids fort doit être à $0$ pour les\ncaractères ASCII.\n"
        }
      ],
      "explanation": "Méthode : $\\text{ord}('A') = 65$, on convertit $65$ en binaire\nsur huit bits ($65 = 64 + 1$) → $01000001_2$. Le bit de poids\nfort à $0$ confirme que c'est un caractère ASCII standard.",
      "variants": [
        {
          "statement": "Quelle est la représentation binaire (sur huit bits) du\ncaractère 'A' en ASCII ?",
          "options": [
            {
              "text": "$00000001$",
              "correct": false,
              "feedback": "Erreur : c'est le code $1$, le rang de A dans\nl'alphabet. En ASCII, ce code correspond à un caractère\nde contrôle, pas à une lettre.\n"
            },
            {
              "text": "$01100001$",
              "correct": false,
              "feedback": "Erreur : c'est le code $97 = 65 + 32$, qui correspond\nà 'a' minuscule, pas 'A' majuscule.\n"
            },
            {
              "text": "$01000001$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('A') = 65 = 64 + 1 = 2^6 + 2^0$,\nsoit $01000001_2$ sur huit bits.\n"
            },
            {
              "text": "$10000001$",
              "correct": false,
              "feedback": "Erreur : ce code ($129$) sort de la table ASCII standard.\nDe plus, le bit de poids fort doit être à $0$ pour les\ncaractères ASCII.\n"
            }
          ],
          "explanation": "Méthode : $\\text{ord}('A') = 65$, on convertit $65$ en binaire\nsur huit bits ($65 = 64 + 1$) → $01000001_2$. Le bit de poids\nfort à $0$ confirme que c'est un caractère ASCII standard."
        },
        {
          "statement": "Quelle est la représentation binaire (sur huit bits) du\ncaractère 'C' en ASCII ?",
          "options": [
            {
              "text": "$00000011$",
              "correct": false,
              "feedback": "Erreur : c'est le code $3$, le rang de C dans\nl'alphabet. En ASCII, ce code correspond à un caractère\nde contrôle, pas à une lettre.\n"
            },
            {
              "text": "$01100011$",
              "correct": false,
              "feedback": "Erreur : c'est le code $99 = 67 + 32$, qui correspond\nà 'c' minuscule, pas 'C' majuscule.\n"
            },
            {
              "text": "$01000011$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('C') = 67 = 64 + 2 + 1 = 2^6 + 2^1 + 2^0$,\nsoit $01000011_2$ sur huit bits.\n"
            },
            {
              "text": "$10000011$",
              "correct": false,
              "feedback": "Erreur : ce code ($131$) sort de la table ASCII standard.\nDe plus, le bit de poids fort doit être à $0$ pour les\ncaractères ASCII.\n"
            }
          ],
          "explanation": "Méthode : $\\text{ord}('C') = 67$, on convertit $67$ en binaire\nsur huit bits ($67 = 64 + 2 + 1$) → $01000011_2$. Le bit de poids\nfort à $0$ confirme que c'est un caractère ASCII standard."
        },
        {
          "statement": "Quelle est la représentation binaire (sur huit bits) du\ncaractère 'H' en ASCII ?",
          "options": [
            {
              "text": "$00001000$",
              "correct": false,
              "feedback": "Erreur : c'est le code $8$, le rang de H dans\nl'alphabet. En ASCII, ce code correspond à un caractère\nde contrôle, pas à une lettre.\n"
            },
            {
              "text": "$01101000$",
              "correct": false,
              "feedback": "Erreur : c'est le code $104 = 72 + 32$, qui correspond\nà 'h' minuscule, pas 'H' majuscule.\n"
            },
            {
              "text": "$01001000$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('H') = 72 = 64 + 8 = 2^6 + 2^3$,\nsoit $01001000_2$ sur huit bits.\n"
            },
            {
              "text": "$10001000$",
              "correct": false,
              "feedback": "Erreur : ce code ($136$) sort de la table ASCII standard.\nDe plus, le bit de poids fort doit être à $0$ pour les\ncaractères ASCII.\n"
            }
          ],
          "explanation": "Méthode : $\\text{ord}('H') = 72$, on convertit $72$ en binaire\nsur huit bits ($72 = 64 + 8$) → $01001000_2$. Le bit de poids\nfort à $0$ confirme que c'est un caractère ASCII standard."
        }
      ]
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "decodage",
        "ascii"
      ],
      "title": "Décoder un texte ASCII",
      "partie": "unicode",
      "statement": "Quel mot représente la suite de codes ASCII (en décimal)\n$$78,\\ 83,\\ 73$$ ?",
      "options": [
        {
          "text": "`NSI`",
          "correct": true,
          "feedback": "Bonne réponse : N vaut $78$, S vaut $83$, I vaut $73$.\nLe mot est donc bien $NSI$.\n"
        },
        {
          "text": "`nsi`",
          "correct": false,
          "feedback": "Erreur : ce sont les majuscules. Les minuscules\ncorrespondantes seraient $110, 115, 105$.\n"
        },
        {
          "text": "`ISN`",
          "correct": false,
          "feedback": "Erreur : les codes ont été lus dans le mauvais ordre. Le\npremier code, $78$, donne la première lettre, N.\n"
        },
        {
          "text": "`OTJ`",
          "correct": false,
          "feedback": "Erreur : chaque lettre est décalée d'un rang, comme si A\nvalait $64$. Or A vaut $65$ : le code $78$ est celui\nde la $14^e$ lettre de l'alphabet, N, et\nnon de la $15^e$.\n"
        }
      ],
      "explanation": "Les majuscules sont consécutives dans la table ASCII à partir\nde $65$ pour A. On peut retrouver chaque lettre rapidement :\npar exemple N est la $14^e$ lettre de l'alphabet, donc\n$\\text{ord}('N') = 65 + 13 = 78$.",
      "variants": [
        {
          "statement": "Quel mot représente la suite de codes ASCII (en décimal)\n$$78,\\ 83,\\ 73$$ ?",
          "options": [
            {
              "text": "`NSI`",
              "correct": true,
              "feedback": "Bonne réponse : N vaut $78$, S vaut $83$, I vaut $73$.\nLe mot est donc bien $NSI$.\n"
            },
            {
              "text": "`nsi`",
              "correct": false,
              "feedback": "Erreur : ce sont les majuscules. Les minuscules\ncorrespondantes seraient $110, 115, 105$.\n"
            },
            {
              "text": "`ISN`",
              "correct": false,
              "feedback": "Erreur : les codes ont été lus dans le mauvais ordre. Le\npremier code, $78$, donne la première lettre, N.\n"
            },
            {
              "text": "`OTJ`",
              "correct": false,
              "feedback": "Erreur : chaque lettre est décalée d'un rang, comme si A\nvalait $64$. Or A vaut $65$ : le code $78$ est celui\nde la $14^e$ lettre de l'alphabet, N, et\nnon de la $15^e$.\n"
            }
          ],
          "explanation": "Les majuscules sont consécutives dans la table ASCII à partir\nde $65$ pour A. On peut retrouver chaque lettre rapidement :\npar exemple N est la $14^e$ lettre de l'alphabet, donc\n$\\text{ord}('N') = 65 + 13 = 78$."
        },
        {
          "statement": "Quel mot représente la suite de codes ASCII (en décimal)\n$$87,\\ 69,\\ 66$$ ?",
          "options": [
            {
              "text": "`WEB`",
              "correct": true,
              "feedback": "Bonne réponse : W vaut $87$, E vaut $69$, B vaut $66$.\nLe mot est donc bien $WEB$.\n"
            },
            {
              "text": "`web`",
              "correct": false,
              "feedback": "Erreur : ce sont les majuscules. Les minuscules\ncorrespondantes seraient $119, 101, 98$.\n"
            },
            {
              "text": "`BEW`",
              "correct": false,
              "feedback": "Erreur : les codes ont été lus dans le mauvais ordre. Le\npremier code, $87$, donne la première lettre, W.\n"
            },
            {
              "text": "`XFC`",
              "correct": false,
              "feedback": "Erreur : chaque lettre est décalée d'un rang, comme si A\nvalait $64$. Or A vaut $65$ : le code $87$ est celui\nde la $23^e$ lettre de l'alphabet, W, et\nnon de la $24^e$.\n"
            }
          ],
          "explanation": "Les majuscules sont consécutives dans la table ASCII à partir\nde $65$ pour A. On peut retrouver chaque lettre rapidement :\npar exemple W est la $23^e$ lettre de l'alphabet, donc\n$\\text{ord}('W') = 65 + 22 = 87$."
        },
        {
          "statement": "Quel mot représente la suite de codes ASCII (en décimal)\n$$66,\\ 73,\\ 84$$ ?",
          "options": [
            {
              "text": "`BIT`",
              "correct": true,
              "feedback": "Bonne réponse : B vaut $66$, I vaut $73$, T vaut $84$.\nLe mot est donc bien $BIT$.\n"
            },
            {
              "text": "`bit`",
              "correct": false,
              "feedback": "Erreur : ce sont les majuscules. Les minuscules\ncorrespondantes seraient $98, 105, 116$.\n"
            },
            {
              "text": "`TIB`",
              "correct": false,
              "feedback": "Erreur : les codes ont été lus dans le mauvais ordre. Le\npremier code, $66$, donne la première lettre, B.\n"
            },
            {
              "text": "`CJU`",
              "correct": false,
              "feedback": "Erreur : chaque lettre est décalée d'un rang, comme si A\nvalait $64$. Or A vaut $65$ : le code $66$ est celui\nde la $2^e$ lettre de l'alphabet, B, et\nnon de la $3^e$.\n"
            }
          ],
          "explanation": "Les majuscules sont consécutives dans la table ASCII à partir\nde $65$ pour A. On peut retrouver chaque lettre rapidement :\npar exemple B est la $2^e$ lettre de l'alphabet, donc\n$\\text{ord}('B') = 65 + 1 = 66$."
        }
      ]
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "utf-8",
        "taille"
      ],
      "title": "Taille d'un caractère en UTF-8",
      "partie": "unicode",
      "statement": "En UTF-$8$, sur combien d'octets est codé un caractère ASCII\nstandard (par exemple la lettre A) ?",
      "options": [
        {
          "text": "$3$ octets",
          "correct": false,
          "feedback": "Erreur : trois octets sont utilisés pour les caractères\nd'autres alphabets (cyrillique, grec étendu, idéogrammes\nchinois courants), pas pour ASCII.\n"
        },
        {
          "text": "$2$ octets",
          "correct": false,
          "feedback": "Erreur : c'est la taille des caractères Latin étendus en\nUTF-$8$ (`é`, `à`, `ü`, etc.). Les caractères ASCII pur\ntiennent sur un seul octet.\n"
        },
        {
          "text": "$1$ octet",
          "correct": true,
          "feedback": "Bonne réponse : c'est précisément le but de la\nrétrocompatibilité d'UTF-$8$ avec ASCII : tout caractère\nASCII tient sur un seul octet, identique à son codage\nASCII.\n"
        },
        {
          "text": "$4$ octets toujours",
          "correct": false,
          "feedback": "Erreur : c'est UTF-$32$ qui code tout sur quatre octets.\nUTF-$8$ est de taille variable.\n"
        }
      ],
      "explanation": "Cette propriété rend UTF-$8$ très efficace pour les langues\nlatines : les textes en anglais ne sont **pas plus gros**\nqu'en ASCII, contrairement à UTF-$16$ ou UTF-$32$."
    },
    {
      "id": "q14",
      "difficulty": 2,
      "skills": [
        "utf-32",
        "taille"
      ],
      "title": "Taille fixe d'UTF-32",
      "partie": "unicode",
      "statement": "Pourquoi UTF-$32$ n'est-il presque jamais utilisé pour stocker\ndes fichiers texte sur le web ?",
      "options": [
        {
          "text": "Parce qu'il ne représente pas tous les caractères Unicode",
          "correct": false,
          "feedback": "Erreur : c'est au contraire le seul qui code tous les\ncaractères sur la même taille. Le problème est ailleurs.\n"
        },
        {
          "text": "Parce qu'il ne supporte pas les emojis",
          "correct": false,
          "feedback": "Erreur : UTF-$32$ code tous les caractères Unicode, emojis compris, chacun sur $4$ octets.\n"
        },
        {
          "text": "Il consomme $4$ octets par caractère, même en ASCII",
          "correct": true,
          "feedback": "Bonne réponse : UTF-$32$ multiplie par quatre la taille\nd'un fichier texte standard, alors que UTF-$8$ ne consomme\nqu'un octet pour les mêmes caractères. C'est un gaspillage\nénorme de bande passante et de stockage.\n"
        },
        {
          "text": "Parce qu'il n'est pas standardisé par l'ISO",
          "correct": false,
          "feedback": "Erreur : UTF-$32$ est bien standardisé. Le problème est\nson inefficacité, pas son statut.\n"
        }
      ],
      "explanation": "Les concepteurs ont fait un compromis : UTF-$8$ est de taille\nvariable mais économe ; UTF-$32$ est simple mais coûteux.\nPour le stockage, UTF-$8$ gagne ; pour le traitement interne\nà un programme (indexation rapide), UTF-$32$ est parfois\nutilisé."
    },
    {
      "id": "q15",
      "difficulty": 2,
      "skills": [
        "hexadecimal",
        "ascii"
      ],
      "title": "Code ASCII en hexadécimal",
      "partie": "ascii",
      "statement": "Quelle est la représentation hexadécimale du code ASCII de la\nlettre 'a' minuscule ?",
      "options": [
        {
          "text": "`0x65`",
          "correct": false,
          "feedback": "Erreur : $0x65 = 6 \\cdot 16 + 5 = 101_{10}$, qui\ncorrespond à `'e'` minuscule.\n"
        },
        {
          "text": "`0x97`",
          "correct": false,
          "feedback": "Erreur : confusion entre la valeur décimale $97$ et son\nécriture hexadécimale. $97_{10} \\neq 0x97$\n(qui vaut $151$).\n"
        },
        {
          "text": "`0x61`",
          "correct": true,
          "feedback": "Bonne réponse : $\\text{ord}('a') = 97 = 6 \\cdot 16 + 1 = 0x61$.\n"
        },
        {
          "text": "`0x41`",
          "correct": false,
          "feedback": "Erreur : `0x41` correspond à $65 = $ 'A' majuscule, pas\nà 'a' minuscule.\n"
        }
      ],
      "explanation": "Pour convertir : $97 = 96 + 1 = 6 \\cdot 16 + 1$, donc en\nhexadécimal le chiffre des « seizaines » est $6$ et celui\ndes unités est $1$, soit `0x61`."
    },
    {
      "id": "q16",
      "difficulty": 2,
      "skills": [
        "python",
        "parcours"
      ],
      "title": "Parcours d'une chaîne en Python",
      "partie": "python",
      "statement": "Que renvoie le code Python suivant ?\n\n```python\nsum([ord(c) for c in \"BA\"])\n```",
      "options": [
        {
          "text": "$131$",
          "correct": true,
          "feedback": "Bonne réponse : $\\text{ord}('B') + \\text{ord}('A') = 66 + 65 = 131$.\n"
        },
        {
          "text": "La chaîne `\"BA\"`",
          "correct": false,
          "feedback": "Erreur : la fonction `sum` additionne des nombres, pas\ndes chaînes. Et chaque `ord(c)` renvoie un entier.\n"
        },
        {
          "text": "$130$",
          "correct": false,
          "feedback": "Erreur d'une unité sur un code : A a été compté\n$64$ au lieu de $65$. Avec les codes exacts,\n$66 + 65 = 131$.\n"
        },
        {
          "text": "$66$",
          "correct": false,
          "feedback": "Erreur : c'est seulement le code de B. La somme inclut\naussi le code de A.\n"
        }
      ],
      "explanation": "La compréhension parcourt la chaîne caractère par caractère et construit la liste des codes `[66, 65]`, que `sum` additionne.",
      "variants": [
        {
          "statement": "Que renvoie le code Python suivant ?\n\n```python\nsum([ord(c) for c in \"BA\"])\n```",
          "options": [
            {
              "text": "$131$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('B') + \\text{ord}('A') = 66 + 65 = 131$.\n"
            },
            {
              "text": "La chaîne `\"BA\"`",
              "correct": false,
              "feedback": "Erreur : la fonction `sum` additionne des nombres, pas\ndes chaînes. Et chaque `ord(c)` renvoie un entier.\n"
            },
            {
              "text": "$130$",
              "correct": false,
              "feedback": "Erreur d'une unité sur un code : A a été compté\n$64$ au lieu de $65$. Avec les codes exacts,\n$66 + 65 = 131$.\n"
            },
            {
              "text": "$66$",
              "correct": false,
              "feedback": "Erreur : c'est seulement le code de B. La somme inclut\naussi le code de A.\n"
            }
          ],
          "explanation": "La compréhension parcourt la chaîne caractère par caractère et construit la liste des codes `[66, 65]`, que `sum` additionne."
        },
        {
          "statement": "Que renvoie le code Python suivant ?\n\n```python\nsum([ord(c) for c in \"CE\"])\n```",
          "options": [
            {
              "text": "$136$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('C') + \\text{ord}('E') = 67 + 69 = 136$.\n"
            },
            {
              "text": "La chaîne `\"CE\"`",
              "correct": false,
              "feedback": "Erreur : la fonction `sum` additionne des nombres, pas\ndes chaînes. Et chaque `ord(c)` renvoie un entier.\n"
            },
            {
              "text": "$135$",
              "correct": false,
              "feedback": "Erreur d'une unité sur un code : E a été compté\n$68$ au lieu de $69$. Avec les codes exacts,\n$67 + 69 = 136$.\n"
            },
            {
              "text": "$67$",
              "correct": false,
              "feedback": "Erreur : c'est seulement le code de C. La somme inclut\naussi le code de E.\n"
            }
          ],
          "explanation": "La compréhension parcourt la chaîne caractère par caractère et construit la liste des codes `[67, 69]`, que `sum` additionne."
        },
        {
          "statement": "Que renvoie le code Python suivant ?\n\n```python\nsum([ord(c) for c in \"GD\"])\n```",
          "options": [
            {
              "text": "$139$",
              "correct": true,
              "feedback": "Bonne réponse : $\\text{ord}('G') + \\text{ord}('D') = 71 + 68 = 139$.\n"
            },
            {
              "text": "La chaîne `\"GD\"`",
              "correct": false,
              "feedback": "Erreur : la fonction `sum` additionne des nombres, pas\ndes chaînes. Et chaque `ord(c)` renvoie un entier.\n"
            },
            {
              "text": "$138$",
              "correct": false,
              "feedback": "Erreur d'une unité sur un code : D a été compté\n$67$ au lieu de $68$. Avec les codes exacts,\n$71 + 68 = 139$.\n"
            },
            {
              "text": "$71$",
              "correct": false,
              "feedback": "Erreur : c'est seulement le code de G. La somme inclut\naussi le code de D.\n"
            }
          ],
          "explanation": "La compréhension parcourt la chaîne caractère par caractère et construit la liste des codes `[71, 68]`, que `sum` additionne."
        }
      ]
    },
    {
      "id": "q17",
      "difficulty": 2,
      "skills": [
        "encodage",
        "accent"
      ],
      "title": "Codage des caractères accentués",
      "partie": "unicode",
      "statement": "En UTF-$8$, sur combien d'octets est codée la lettre 'é' ?",
      "options": [
        {
          "text": "$2$ octets",
          "correct": true,
          "feedback": "Bonne réponse : 'é' a pour point de code Unicode `U+00E9`.\nEn UTF-$8$, les caractères entre `U+0080` et `U+07FF` sont\ncodés sur deux octets ($0xC3$ $0xA9$).\n"
        },
        {
          "text": "$4$ octets",
          "correct": false,
          "feedback": "Erreur : quatre octets sont utilisés pour les points de\ncode au-delà de `U+FFFF` (emojis, certaines écritures\nrares).\n"
        },
        {
          "text": "$3$ octets",
          "correct": false,
          "feedback": "Erreur : trois octets sont utilisés pour des points de\ncode plus élevés (à partir de `U+0800`).\n"
        },
        {
          "text": "$1$ octet",
          "correct": false,
          "feedback": "Erreur : seules les lettres ASCII sont codées sur un\noctet. Les caractères accentués sortent de la plage ASCII.\n"
        }
      ],
      "explanation": "C'est pour cette raison qu'un texte français codé en UTF-$8$\nest légèrement plus volumineux qu'en ASCII : chaque lettre\naccentuée pèse deux octets au lieu d'un."
    },
    {
      "id": "q18",
      "difficulty": 2,
      "skills": [
        "ascii",
        "etendu"
      ],
      "title": "ASCII étendu",
      "partie": "ascii",
      "statement": "Quelle modification a permis le passage d'ASCII à l'ASCII\nétendu ?",
      "options": [
        {
          "text": "L'ajout d'un neuvième bit pour le drapeau de signe binaire",
          "correct": false,
          "feedback": "Erreur : il n'y a pas de drapeau de signe dans un codage\nde caractères. Le passage à l'ASCII étendu utilise le\nhuitième bit déjà présent.\n"
        },
        {
          "text": "Utiliser le huitième bit pour doubler la table",
          "correct": true,
          "feedback": "Bonne réponse : ASCII standard n'utilisait que sept bits\n($128$ codes) ; le huitième bit étant disponible, on peut\nen faire un encodage à $256$ codes pour ajouter accents,\nsymboles mathématiques, etc.\n"
        },
        {
          "text": "Le passage à un codage en hexadécimal",
          "correct": false,
          "feedback": "Erreur : la base de représentation (binaire, décimale,\nhexadécimale) n'a aucun impact sur le nombre de codes\npossibles.\n"
        },
        {
          "text": "La conversion en UTF-$8$ obligatoire",
          "correct": false,
          "feedback": "Erreur : UTF-$8$ est bien plus tardif que l'ASCII étendu.\nL'extension à $256$ codes a été un premier compromis\navant la solution Unicode.\n"
        }
      ],
      "explanation": "Plusieurs variantes d'ASCII étendu existent : Latin-$1$\n(ISO-$8859$-$1$) pour l'Europe occidentale, Latin-$2$ pour\nl'Europe centrale, etc. Cette fragmentation a motivé la\ncréation d'Unicode comme standard universel."
    },
    {
      "id": "q19",
      "difficulty": 2,
      "skills": [
        "html",
        "balises"
      ],
      "title": "Rôle des balises HTML",
      "partie": "unicode",
      "statement": "Que représentent les balises ouvrantes et fermantes en HTML\n(par exemple `<p>...</p>`) ?",
      "options": [
        {
          "text": "Les noms des fichiers liés au document",
          "correct": false,
          "feedback": "Erreur : les fichiers liés sont référencés par leur URL,\ndans des attributs comme `href` ou `src`, pas par les\nbalises elles-mêmes.\n"
        },
        {
          "text": "Des marqueurs qui structurent le contenu de la page",
          "correct": true,
          "feedback": "Bonne réponse : les balises délimitent des éléments\n(paragraphes, titres, liens, images, etc.) que le\nnavigateur transforme en éléments visuels.\n"
        },
        {
          "text": "Des macros pour remplacer du texte",
          "correct": false,
          "feedback": "Erreur : HTML n'a pas de système de macros. Une balise ne remplace aucun texte, elle délimite un élément de la page.\n"
        },
        {
          "text": "Des commandes envoyées directement au serveur web",
          "correct": false,
          "feedback": "Erreur : les balises HTML structurent le document\ncôté **client** (navigateur), pas le serveur. Les\nrequêtes au serveur sont gérées par le protocole HTTP.\n"
        }
      ],
      "explanation": "Une balise comme `<p>` ouvre un paragraphe, `</p>` le ferme. Les attributs (`id`, `class`, `href`, etc.) précisent le comportement ou le style. Les éléments ainsi délimités s'emboîtent les uns dans les autres pour former la structure de la page."
    },
    {
      "id": "q21",
      "difficulty": 3,
      "skills": [
        "unicode",
        "motivation"
      ],
      "title": "Motivation historique d'Unicode",
      "partie": "unicode",
      "statement": "Pour quelle raison principale Unicode a-t-il été créé après\nl'ASCII étendu ?",
      "options": [
        {
          "text": "Pour réduire la taille des fichiers texte",
          "correct": false,
          "feedback": "Erreur : un fichier Unicode (UTF-$8$) n'est pas plus\ncompact qu'un fichier ASCII pour les langues latines, et\nil l'est moins pour d'autres langues. La motivation\nn'est pas la taille.\n"
        },
        {
          "text": "Unifier les tables d'ASCII étendu incompatibles",
          "correct": true,
          "feedback": "Bonne réponse : un même octet (par exemple $0xE9$) avait\ndes significations différentes selon la table. Un texte\nécrit en Latin-$1$ s'affichait incorrectement sur une\nmachine configurée en Latin-$2$. Unicode résout ce\nproblème en attribuant un point de code unique à chaque\ncaractère du monde.\n"
        },
        {
          "text": "Pour ajouter le support de la couleur dans le texte",
          "correct": false,
          "feedback": "Erreur : la couleur relève de la mise en forme (HTML/CSS),\npas du codage de caractères.\n"
        },
        {
          "text": "Pour remplacer le format PDF",
          "correct": false,
          "feedback": "Erreur : Unicode est un codage de caractères, pas un\nformat de document. PDF reste un format de mise en page.\n"
        }
      ],
      "explanation": "Avant Unicode, échanger un texte écrit en arabe vers un\nposte configuré pour les langues d'Europe centrale produisait\ndes « caractères mojibake » illisibles. Unicode a unifié les\ncodes pour permettre une vraie interopérabilité mondiale."
    },
    {
      "id": "q22",
      "difficulty": 3,
      "skills": [
        "encodage",
        "taille"
      ],
      "title": "Calcul de la taille d'un texte",
      "partie": "unicode",
      "statement": "Combien d'octets occupe la chaîne `\"NSI\"` lorsqu'elle est\nstockée en UTF-$8$ ?",
      "options": [
        {
          "text": "$3$ octets",
          "correct": true,
          "feedback": "Bonne réponse : les $3$ caractères de `\"NSI\"` sont des\ncaractères ASCII, codés chacun sur $1$ octet en UTF-$8$.\nTotal : $3$ octets.\n"
        },
        {
          "text": "$1$ octet",
          "correct": false,
          "feedback": "Erreur : un seul octet code un seul caractère ASCII, pas\nune chaîne de $3$ caractères.\n"
        },
        {
          "text": "$12$ octets",
          "correct": false,
          "feedback": "Erreur : c'est la taille en UTF-$32$ ($4$ octets par\ncaractère). En UTF-$8$, un caractère ASCII n'occupe qu'un\noctet, quatre fois moins.\n"
        },
        {
          "text": "$6$ octets",
          "correct": false,
          "feedback": "Erreur : c'est la taille en UTF-$16$ ($2$ octets par\ncaractère du plan de base). En UTF-$8$, c'est plus\néconomique.\n"
        }
      ],
      "explanation": "Pour un texte purement ASCII, UTF-$8$ donne le même nombre\nd'octets que la longueur de la chaîne. Avec des accents (`é`,\n`à`, etc.), il faut compter $2$ octets par caractère accentué.",
      "variants": [
        {
          "statement": "Combien d'octets occupe la chaîne `\"NSI\"` lorsqu'elle est\nstockée en UTF-$8$ ?",
          "options": [
            {
              "text": "$3$ octets",
              "correct": true,
              "feedback": "Bonne réponse : les $3$ caractères de `\"NSI\"` sont des\ncaractères ASCII, codés chacun sur $1$ octet en UTF-$8$.\nTotal : $3$ octets.\n"
            },
            {
              "text": "$1$ octet",
              "correct": false,
              "feedback": "Erreur : un seul octet code un seul caractère ASCII, pas\nune chaîne de $3$ caractères.\n"
            },
            {
              "text": "$12$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$32$ ($4$ octets par\ncaractère). En UTF-$8$, un caractère ASCII n'occupe qu'un\noctet, quatre fois moins.\n"
            },
            {
              "text": "$6$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$16$ ($2$ octets par\ncaractère du plan de base). En UTF-$8$, c'est plus\néconomique.\n"
            }
          ],
          "explanation": "Pour un texte purement ASCII, UTF-$8$ donne le même nombre\nd'octets que la longueur de la chaîne. Avec des accents (`é`,\n`à`, etc.), il faut compter $2$ octets par caractère accentué."
        },
        {
          "statement": "Combien d'octets occupe la chaîne `\"PYTHON\"` lorsqu'elle est\nstockée en UTF-$8$ ?",
          "options": [
            {
              "text": "$6$ octets",
              "correct": true,
              "feedback": "Bonne réponse : les $6$ caractères de `\"PYTHON\"` sont des\ncaractères ASCII, codés chacun sur $1$ octet en UTF-$8$.\nTotal : $6$ octets.\n"
            },
            {
              "text": "$1$ octet",
              "correct": false,
              "feedback": "Erreur : un seul octet code un seul caractère ASCII, pas\nune chaîne de $6$ caractères.\n"
            },
            {
              "text": "$24$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$32$ ($4$ octets par\ncaractère). En UTF-$8$, un caractère ASCII n'occupe qu'un\noctet, quatre fois moins.\n"
            },
            {
              "text": "$12$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$16$ ($2$ octets par\ncaractère du plan de base). En UTF-$8$, c'est plus\néconomique.\n"
            }
          ],
          "explanation": "Pour un texte purement ASCII, UTF-$8$ donne le même nombre\nd'octets que la longueur de la chaîne. Avec des accents (`é`,\n`à`, etc.), il faut compter $2$ octets par caractère accentué."
        },
        {
          "statement": "Combien d'octets occupe la chaîne `\"ROBOT\"` lorsqu'elle est\nstockée en UTF-$8$ ?",
          "options": [
            {
              "text": "$5$ octets",
              "correct": true,
              "feedback": "Bonne réponse : les $5$ caractères de `\"ROBOT\"` sont des\ncaractères ASCII, codés chacun sur $1$ octet en UTF-$8$.\nTotal : $5$ octets.\n"
            },
            {
              "text": "$1$ octet",
              "correct": false,
              "feedback": "Erreur : un seul octet code un seul caractère ASCII, pas\nune chaîne de $5$ caractères.\n"
            },
            {
              "text": "$20$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$32$ ($4$ octets par\ncaractère). En UTF-$8$, un caractère ASCII n'occupe qu'un\noctet, quatre fois moins.\n"
            },
            {
              "text": "$10$ octets",
              "correct": false,
              "feedback": "Erreur : c'est la taille en UTF-$16$ ($2$ octets par\ncaractère du plan de base). En UTF-$8$, c'est plus\néconomique.\n"
            }
          ],
          "explanation": "Pour un texte purement ASCII, UTF-$8$ donne le même nombre\nd'octets que la longueur de la chaîne. Avec des accents (`é`,\n`à`, etc.), il faut compter $2$ octets par caractère accentué."
        }
      ]
    },
    {
      "id": "q25",
      "difficulty": 3,
      "skills": [
        "retro-compatibilite",
        "utf-8"
      ],
      "title": "Rétrocompatibilité d'UTF-8",
      "partie": "unicode",
      "statement": "Pourquoi peut-on dire qu'un fichier ASCII pur est aussi un\nfichier UTF-$8$ valide ?",
      "options": [
        {
          "text": "Parce que tous les fichiers texte sont automatiquement convertis en UTF-$8$ par le système",
          "correct": false,
          "feedback": "Erreur : aucune conversion automatique n'est appliquée.\nLa rétrocompatibilité est une propriété du **format**\nUTF-$8$, pas du système.\n"
        },
        {
          "text": "Parce qu'ASCII et UTF-$8$ utilisent tous deux des points de code Unicode",
          "correct": false,
          "feedback": "Erreur : ASCII précède Unicode de plusieurs décennies.\nC'est UTF-$8$ qui a été conçu pour reprendre les codes\nASCII à l'identique, pas l'inverse.\n"
        },
        {
          "text": "UTF-$8$ reprend à l'identique le codage des $128$ caractères ASCII",
          "correct": true,
          "feedback": "Bonne réponse : c'est un choix volontaire des concepteurs\nd'UTF-$8$ (Ken Thompson, Rob Pike, $1992$). Cette\ncompatibilité ascendante a énormément facilité la\ntransition d'ASCII vers Unicode sur le web et dans les\nsystèmes Unix.\n"
        },
        {
          "text": "Parce qu'UTF-$8$ et ASCII sont strictement le même format",
          "correct": false,
          "feedback": "Erreur : UTF-$8$ est plus large qu'ASCII. Un fichier\nUTF-$8$ peut contenir des caractères impossibles à\nreprésenter en ASCII (accents, idéogrammes, etc.).\n"
        }
      ],
      "explanation": "Cette propriété de UTF-$8$ explique son succès : on peut\nouvrir tout fichier ASCII existant sans modification dans un\néditeur UTF-$8$. C'est l'inverse qui n'est pas garanti : un\nfichier UTF-$8$ contenant des accents s'affichera\nincorrectement sur un système ASCII strict."
    },
    {
      "id": "q26",
      "difficulty": 2,
      "skills": [
        "utf-8",
        "taille",
        "accent"
      ],
      "title": "Taille d'un caractère accentué en UTF-8",
      "partie": "unicode",
      "statement": "Combien d'octets sont nécessaires en UTF-$8$ pour coder le\ncaractère `é` (point de code Unicode U+00E9, soit $233$ en\ndécimal) ?",
      "options": [
        {
          "text": "$1$ octet",
          "correct": false,
          "feedback": "Erreur : seuls les caractères de point de code inférieur\nou égal à $127$ tiennent sur un seul octet en UTF-$8$\n(zone ASCII pure). Comme $233 > 127$, le caractère `é`\nnécessite un encodage sur plusieurs octets.\n"
        },
        {
          "text": "$3$ octets",
          "correct": false,
          "feedback": "Erreur : trois octets en UTF-$8$ sont réservés aux points\nde code de $2\\,048$ à $65\\,535$, ce qui couvre la plupart\ndes alphabets non latins (cyrillique, grec, hébreu,\nidéogrammes chinois courants). Le `é` est trop « bas »\npour cela.\n"
        },
        {
          "text": "$2$ octets",
          "correct": true,
          "feedback": "Bonne réponse : en UTF-$8$, les caractères de point de\ncode compris entre $128$ et $2\\,047$ sont codés sur deux\noctets. Le `é` (point de code $233$) entre dans cette\nplage et s'écrit, en hexadécimal, $\\text{C3 A9}$.\n"
        },
        {
          "text": "$4$ octets",
          "correct": false,
          "feedback": "Erreur : quatre octets sont utilisés pour les points de\ncode dépassant $65\\,535$, comme la majorité des emojis.\nLe `é` n'a besoin que de deux octets.\n"
        }
      ],
      "explanation": "L'UTF-$8$ utilise un nombre variable d'octets selon le point\nde code : $1$ pour $0$ à $127$ (compatibilité ASCII), $2$\npour $128$ à $2\\,047$, $3$ pour $2\\,048$ à $65\\,535$, $4$\nau-delà. Le seuil à $128$ explique pourquoi `é`, `à` ou `ç`\noccupent deux octets sur disque, alors qu'on les perçoit\ncomme un seul caractère à l'écran."
    },
    {
      "id": "q28",
      "difficulty": 2,
      "skills": [
        "ascii",
        "controle"
      ],
      "title": "Caractères de contrôle ASCII",
      "partie": "ascii",
      "statement": "Les codes ASCII de $0$ à $31$ ne correspondent pas à des\ncaractères imprimables. À quoi servent-ils ?",
      "options": [
        {
          "text": "À des caractères de contrôle (saut de ligne, tabulation)",
          "correct": true,
          "feedback": "Bonne réponse : ces codes représentent des actions plutôt\nque des caractères visibles. Exemples connus : `\\n`\n(saut de ligne, code $10$), `\\r` (retour chariot, code\n$13$), `\\t` (tabulation, code $9$), `\\0` (caractère nul,\ncode $0$).\n"
        },
        {
          "text": "À coder les chiffres et la ponctuation",
          "correct": false,
          "feedback": "Erreur : les chiffres ASCII commencent au code $48$\n(le caractère `'0'`) et la ponctuation s'étale de $32$ à\n$47$ et de $58$ à $64$. Les codes strictement inférieurs\nà $32$ sont tous non imprimables.\n"
        },
        {
          "text": "À aucun usage : ils sont réservés et inutilisés",
          "correct": false,
          "feedback": "Erreur : ces codes ont au contraire des usages historiques\nprécis dans les terminaux et les protocoles. Ils pilotent\nle comportement d'affichage ou de transmission.\n"
        },
        {
          "text": "À coder les caractères accentués des langues européennes",
          "correct": false,
          "feedback": "Erreur : ASCII standard ne code pas les accents (la table\nne dépasse pas $127$). Les caractères accentués sont\narrivés avec les extensions ASCII (Latin-$1$, etc.), puis\navec Unicode.\n"
        }
      ],
      "explanation": "Les caractères de contrôle ASCII étaient à l'origine conçus pour piloter les terminaux mécaniques (téléimprimeurs). Ils restent essentiels aujourd'hui pour structurer le texte, avec les sauts de ligne et les tabulations."
    },
    {
      "id": "q29",
      "difficulty": 3,
      "skills": [
        "unicode",
        "utf-8",
        "longueur",
        "python"
      ],
      "title": "Longueur d'une chaîne accentuée en Python",
      "partie": "unicode",
      "statement": "Le programme suivant affiche la longueur d'un mot, puis l'enregistre dans un fichier encodé en UTF-8 :\n\n```python\ntexte = \"café\"\nprint(len(texte))\nwith open(\"mot.txt\", \"w\", encoding=\"utf-8\") as f:\n    f.write(texte)\n```\n\nLa valeur affichée est-elle égale à la taille du fichier `mot.txt`, en octets ?",
      "options": [
        {
          "text": "Oui, les deux valent $5$",
          "correct": false,
          "feedback": "Erreur : `len(texte)` compte les caractères, pas les octets. Pour `\"café\"`, qui compte $4$ caractères, la valeur affichée est $4$.\n"
        },
        {
          "text": "Oui, les deux valent $4$",
          "correct": false,
          "feedback": "Erreur : seule la valeur affichée vaut $4$. Comme `é` occupe deux octets en UTF-$8$, le fichier contient $5$ octets.\n"
        },
        {
          "text": "Non, $4$ affiché pour un fichier de $5$ octets",
          "correct": true,
          "feedback": "Bonne réponse : `len(texte)` compte les **caractères** (ici $4$ : `c`, `a`, `f`, `é`), tandis que le fichier contient les **octets** de l'encodage UTF-8 (ici $5$, car `é` occupe deux octets).\n"
        },
        {
          "text": "Non, $5$ affiché pour un fichier de $4$ octets",
          "correct": false,
          "feedback": "Erreur : c'est l'inverse. Un texte ne compte jamais plus de caractères que son écriture en octets, puisque chaque caractère occupe au moins un octet.\n"
        }
      ],
      "explanation": "Distinction fondamentale : en Python $3$, une chaîne est une suite de caractères, et `len` compte ces caractères. La taille d'un fichier dépend de l'encodage : en UTF-8, un caractère non ASCII comme `é` occupe plusieurs octets, d'où un fichier plus long que la chaîne.",
      "variants": [
        {
          "statement": "Le programme suivant affiche la longueur d'un mot, puis l'enregistre dans un fichier encodé en UTF-8 :\n\n```python\ntexte = \"café\"\nprint(len(texte))\nwith open(\"mot.txt\", \"w\", encoding=\"utf-8\") as f:\n    f.write(texte)\n```\n\nLa valeur affichée est-elle égale à la taille du fichier `mot.txt`, en octets ?",
          "options": [
            {
              "text": "Oui, les deux valent $5$",
              "correct": false,
              "feedback": "Erreur : `len(texte)` compte les caractères, pas les octets. Pour `\"café\"`, qui compte $4$ caractères, la valeur affichée est $4$.\n"
            },
            {
              "text": "Oui, les deux valent $4$",
              "correct": false,
              "feedback": "Erreur : seule la valeur affichée vaut $4$. Comme `é` occupe deux octets en UTF-$8$, le fichier contient $5$ octets.\n"
            },
            {
              "text": "Non, $4$ affiché pour un fichier de $5$ octets",
              "correct": true,
              "feedback": "Bonne réponse : `len(texte)` compte les **caractères** (ici $4$ : `c`, `a`, `f`, `é`), tandis que le fichier contient les **octets** de l'encodage UTF-8 (ici $5$, car `é` occupe deux octets).\n"
            },
            {
              "text": "Non, $5$ affiché pour un fichier de $4$ octets",
              "correct": false,
              "feedback": "Erreur : c'est l'inverse. Un texte ne compte jamais plus de caractères que son écriture en octets, puisque chaque caractère occupe au moins un octet.\n"
            }
          ],
          "explanation": "Distinction fondamentale : en Python $3$, une chaîne est une suite de caractères, et `len` compte ces caractères. La taille d'un fichier dépend de l'encodage : en UTF-8, un caractère non ASCII comme `é` occupe plusieurs octets, d'où un fichier plus long que la chaîne."
        },
        {
          "statement": "Le programme suivant affiche la longueur d'un mot, puis l'enregistre dans un fichier encodé en UTF-8 :\n\n```python\ntexte = \"forêt\"\nprint(len(texte))\nwith open(\"mot.txt\", \"w\", encoding=\"utf-8\") as f:\n    f.write(texte)\n```\n\nLa valeur affichée est-elle égale à la taille du fichier `mot.txt`, en octets ?",
          "options": [
            {
              "text": "Oui, les deux valent $6$",
              "correct": false,
              "feedback": "Erreur : `len(texte)` compte les caractères, pas les octets. Pour `\"forêt\"`, qui compte $5$ caractères, la valeur affichée est $5$.\n"
            },
            {
              "text": "Oui, les deux valent $5$",
              "correct": false,
              "feedback": "Erreur : seule la valeur affichée vaut $5$. Comme `ê` occupe deux octets en UTF-$8$, le fichier contient $6$ octets.\n"
            },
            {
              "text": "Non, $5$ affiché pour un fichier de $6$ octets",
              "correct": true,
              "feedback": "Bonne réponse : `len(texte)` compte les **caractères** (ici $5$ : `f`, `o`, `r`, `ê`, `t`), tandis que le fichier contient les **octets** de l'encodage UTF-8 (ici $6$, car `ê` occupe deux octets).\n"
            },
            {
              "text": "Non, $6$ affiché pour un fichier de $5$ octets",
              "correct": false,
              "feedback": "Erreur : c'est l'inverse. Un texte ne compte jamais plus de caractères que son écriture en octets, puisque chaque caractère occupe au moins un octet.\n"
            }
          ],
          "explanation": "Distinction fondamentale : en Python $3$, une chaîne est une suite de caractères, et `len` compte ces caractères. La taille d'un fichier dépend de l'encodage : en UTF-8, un caractère non ASCII comme `é` occupe plusieurs octets, d'où un fichier plus long que la chaîne."
        },
        {
          "statement": "Le programme suivant affiche la longueur d'un mot, puis l'enregistre dans un fichier encodé en UTF-8 :\n\n```python\ntexte = \"élève\"\nprint(len(texte))\nwith open(\"mot.txt\", \"w\", encoding=\"utf-8\") as f:\n    f.write(texte)\n```\n\nLa valeur affichée est-elle égale à la taille du fichier `mot.txt`, en octets ?",
          "options": [
            {
              "text": "Oui, les deux valent $7$",
              "correct": false,
              "feedback": "Erreur : `len(texte)` compte les caractères, pas les octets. Pour `\"élève\"`, qui compte $5$ caractères, la valeur affichée est $5$.\n"
            },
            {
              "text": "Oui, les deux valent $5$",
              "correct": false,
              "feedback": "Erreur : seule la valeur affichée vaut $5$. Comme `é` et `è` occupent chacune deux octets en UTF-$8$, le fichier contient $7$ octets.\n"
            },
            {
              "text": "Non, $5$ affiché pour un fichier de $7$ octets",
              "correct": true,
              "feedback": "Bonne réponse : `len(texte)` compte les **caractères** (ici $5$ : `é`, `l`, `è`, `v`, `e`), tandis que le fichier contient les **octets** de l'encodage UTF-8 (ici $7$, car `é` et `è` occupent chacune deux octets).\n"
            },
            {
              "text": "Non, $7$ affiché pour un fichier de $5$ octets",
              "correct": false,
              "feedback": "Erreur : c'est l'inverse. Un texte ne compte jamais plus de caractères que son écriture en octets, puisque chaque caractère occupe au moins un octet.\n"
            }
          ],
          "explanation": "Distinction fondamentale : en Python $3$, une chaîne est une suite de caractères, et `len` compte ces caractères. La taille d'un fichier dépend de l'encodage : en UTF-8, un caractère non ASCII comme `é` occupe plusieurs octets, d'où un fichier plus long que la chaîne."
        }
      ]
    },
    {
      "id": "q30",
      "difficulty": 1,
      "skills": [
        "ascii",
        "code",
        "lettres"
      ],
      "title": "Le code d'une lettre majuscule",
      "partie": "ascii",
      "statement": "Dans la table ASCII, `'A'` a le code $65$ et les lettres majuscules\nse suivent. Quel est le code de `'E'` ?",
      "options": [
        {
          "text": "$69$",
          "correct": true,
          "feedback": "Bonne réponse : `'E'` est la lettre numéro 5 de\nl'alphabet, donc son code est $65 + 5 - 1 = 69$.\n"
        },
        {
          "text": "$70$",
          "correct": false,
          "feedback": "Erreur : décalage d'une unité. `'A'` vaut $65$, `'B'` $66$, et\nainsi de suite : `'E'` vaut $65 + 5 - 1$.\n"
        },
        {
          "text": "$101$",
          "correct": false,
          "feedback": "Erreur : $101$ est le code de la minuscule `'E'` en\nminuscule, $32$ de plus que la majuscule.\n"
        },
        {
          "text": "$5$",
          "correct": false,
          "feedback": "Erreur : 5 est le rang de la lettre dans l'alphabet, pas son\ncode ASCII, qui commence à $65$ pour `'A'`.\n"
        }
      ],
      "explanation": "Les majuscules occupent les codes $65$ à $90$ dans l'ordre\nalphabétique, les minuscules $97$ à $122$.",
      "variants": [
        {
          "statement": "Dans la table ASCII, `'A'` a le code $65$ et les lettres majuscules\nse suivent. Quel est le code de `'E'` ?",
          "options": [
            {
              "text": "$69$",
              "correct": true,
              "feedback": "Bonne réponse : `'E'` est la lettre numéro 5 de\nl'alphabet, donc son code est $65 + 5 - 1 = 69$.\n"
            },
            {
              "text": "$70$",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. `'A'` vaut $65$, `'B'` $66$, et\nainsi de suite : `'E'` vaut $65 + 5 - 1$.\n"
            },
            {
              "text": "$101$",
              "correct": false,
              "feedback": "Erreur : $101$ est le code de la minuscule `'E'` en\nminuscule, $32$ de plus que la majuscule.\n"
            },
            {
              "text": "$5$",
              "correct": false,
              "feedback": "Erreur : 5 est le rang de la lettre dans l'alphabet, pas son\ncode ASCII, qui commence à $65$ pour `'A'`.\n"
            }
          ],
          "explanation": "Les majuscules occupent les codes $65$ à $90$ dans l'ordre\nalphabétique, les minuscules $97$ à $122$."
        },
        {
          "statement": "Dans la table ASCII, `'A'` a le code $65$ et les lettres majuscules\nse suivent. Quel est le code de `'C'` ?",
          "options": [
            {
              "text": "$67$",
              "correct": true,
              "feedback": "Bonne réponse : `'C'` est la lettre numéro 3 de\nl'alphabet, donc son code est $65 + 3 - 1 = 67$.\n"
            },
            {
              "text": "$68$",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. `'A'` vaut $65$, `'B'` $66$, et\nainsi de suite : `'C'` vaut $65 + 3 - 1$.\n"
            },
            {
              "text": "$99$",
              "correct": false,
              "feedback": "Erreur : $99$ est le code de la minuscule `'C'` en\nminuscule, $32$ de plus que la majuscule.\n"
            },
            {
              "text": "$3$",
              "correct": false,
              "feedback": "Erreur : 3 est le rang de la lettre dans l'alphabet, pas son\ncode ASCII, qui commence à $65$ pour `'A'`.\n"
            }
          ],
          "explanation": "Les majuscules occupent les codes $65$ à $90$ dans l'ordre\nalphabétique, les minuscules $97$ à $122$."
        },
        {
          "statement": "Dans la table ASCII, `'A'` a le code $65$ et les lettres majuscules\nse suivent. Quel est le code de `'J'` ?",
          "options": [
            {
              "text": "$74$",
              "correct": true,
              "feedback": "Bonne réponse : `'J'` est la lettre numéro 10 de\nl'alphabet, donc son code est $65 + 10 - 1 = 74$.\n"
            },
            {
              "text": "$75$",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. `'A'` vaut $65$, `'B'` $66$, et\nainsi de suite : `'J'` vaut $65 + 10 - 1$.\n"
            },
            {
              "text": "$106$",
              "correct": false,
              "feedback": "Erreur : $106$ est le code de la minuscule `'J'` en\nminuscule, $32$ de plus que la majuscule.\n"
            },
            {
              "text": "$10$",
              "correct": false,
              "feedback": "Erreur : 10 est le rang de la lettre dans l'alphabet, pas son\ncode ASCII, qui commence à $65$ pour `'A'`.\n"
            }
          ],
          "explanation": "Les majuscules occupent les codes $65$ à $90$ dans l'ordre\nalphabétique, les minuscules $97$ à $122$."
        }
      ]
    },
    {
      "id": "q31",
      "difficulty": 2,
      "skills": [
        "ascii",
        "chiffres",
        "code"
      ],
      "title": "Le code du caractère d'un chiffre",
      "partie": "ascii",
      "statement": "Le caractère `'0'` a le code ASCII $48$. Quel est le code du\ncaractère `'7'` ?",
      "options": [
        {
          "text": "$55$",
          "correct": true,
          "feedback": "Bonne réponse : les chiffres se suivent à partir de $48$, donc\n`'7'` vaut $48 + 7 = 55$. Le caractère et le nombre\nsont deux choses différentes.\n"
        },
        {
          "text": "$7$",
          "correct": false,
          "feedback": "Erreur : $7$ est la valeur numérique, pas le code du caractère\nqui la représente.\n"
        },
        {
          "text": "$72$",
          "correct": false,
          "feedback": "Erreur : $65$ est le code de `'A'`, pas celui de `'0'`. Les\nchiffres sont rangés avant les lettres.\n"
        },
        {
          "text": "$70$",
          "correct": false,
          "feedback": "Erreur : les codes des chiffres se suivent d'une unité en une\nunité à partir de $48$.\n"
        }
      ],
      "explanation": "Un fichier texte contenant `7` ne contient pas le nombre\n$7$ mais le caractère de code $55$ ; c'est pourquoi une\nsaisie doit être convertie avec `int` avant tout calcul.",
      "variants": [
        {
          "statement": "Le caractère `'0'` a le code ASCII $48$. Quel est le code du\ncaractère `'7'` ?",
          "options": [
            {
              "text": "$55$",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres se suivent à partir de $48$, donc\n`'7'` vaut $48 + 7 = 55$. Le caractère et le nombre\nsont deux choses différentes.\n"
            },
            {
              "text": "$7$",
              "correct": false,
              "feedback": "Erreur : $7$ est la valeur numérique, pas le code du caractère\nqui la représente.\n"
            },
            {
              "text": "$72$",
              "correct": false,
              "feedback": "Erreur : $65$ est le code de `'A'`, pas celui de `'0'`. Les\nchiffres sont rangés avant les lettres.\n"
            },
            {
              "text": "$70$",
              "correct": false,
              "feedback": "Erreur : les codes des chiffres se suivent d'une unité en une\nunité à partir de $48$.\n"
            }
          ],
          "explanation": "Un fichier texte contenant `7` ne contient pas le nombre\n$7$ mais le caractère de code $55$ ; c'est pourquoi une\nsaisie doit être convertie avec `int` avant tout calcul."
        },
        {
          "statement": "Le caractère `'0'` a le code ASCII $48$. Quel est le code du\ncaractère `'3'` ?",
          "options": [
            {
              "text": "$51$",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres se suivent à partir de $48$, donc\n`'3'` vaut $48 + 3 = 51$. Le caractère et le nombre\nsont deux choses différentes.\n"
            },
            {
              "text": "$3$",
              "correct": false,
              "feedback": "Erreur : $3$ est la valeur numérique, pas le code du caractère\nqui la représente.\n"
            },
            {
              "text": "$68$",
              "correct": false,
              "feedback": "Erreur : $65$ est le code de `'A'`, pas celui de `'0'`. Les\nchiffres sont rangés avant les lettres.\n"
            },
            {
              "text": "$30$",
              "correct": false,
              "feedback": "Erreur : les codes des chiffres se suivent d'une unité en une\nunité à partir de $48$.\n"
            }
          ],
          "explanation": "Un fichier texte contenant `3` ne contient pas le nombre\n$3$ mais le caractère de code $51$ ; c'est pourquoi une\nsaisie doit être convertie avec `int` avant tout calcul."
        },
        {
          "statement": "Le caractère `'0'` a le code ASCII $48$. Quel est le code du\ncaractère `'9'` ?",
          "options": [
            {
              "text": "$57$",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres se suivent à partir de $48$, donc\n`'9'` vaut $48 + 9 = 57$. Le caractère et le nombre\nsont deux choses différentes.\n"
            },
            {
              "text": "$9$",
              "correct": false,
              "feedback": "Erreur : $9$ est la valeur numérique, pas le code du caractère\nqui la représente.\n"
            },
            {
              "text": "$74$",
              "correct": false,
              "feedback": "Erreur : $65$ est le code de `'A'`, pas celui de `'0'`. Les\nchiffres sont rangés avant les lettres.\n"
            },
            {
              "text": "$90$",
              "correct": false,
              "feedback": "Erreur : les codes des chiffres se suivent d'une unité en une\nunité à partir de $48$.\n"
            }
          ],
          "explanation": "Un fichier texte contenant `9` ne contient pas le nombre\n$9$ mais le caractère de code $57$ ; c'est pourquoi une\nsaisie doit être convertie avec `int` avant tout calcul."
        }
      ]
    },
    {
      "id": "q32",
      "difficulty": 2,
      "skills": [
        "ascii",
        "comparaison",
        "ordre"
      ],
      "title": "Une majuscule plus petite qu'une minuscule",
      "partie": "ascii",
      "statement": "En Python, `\"Z\" < \"a\"` vaut `True`. Pourquoi ?",
      "options": [
        {
          "text": "Parce que les chaînes se comparent par les codes de leurs caractères, et $90 < 97$",
          "correct": true,
          "feedback": "Bonne réponse : `'Z'` a le code $90$ et `'a'` le code $97$. Les\nmajuscules précèdent toutes les minuscules dans la table ASCII.\n"
        },
        {
          "text": "Parce que Python compare les lettres selon l'ordre alphabétique sans tenir compte de la casse",
          "correct": false,
          "feedback": "Erreur : dans l'ordre alphabétique, Z viendrait après a. La\ncomparaison suit les codes, pas le dictionnaire.\n"
        },
        {
          "text": "Parce qu'une chaîne d'une majuscule est plus courte qu'une chaîne d'une minuscule",
          "correct": false,
          "feedback": "Erreur : les deux chaînes ont la même longueur, un caractère.\n"
        },
        {
          "text": "Parce que `<` compare les positions des touches sur le clavier",
          "correct": false,
          "feedback": "Erreur : le clavier n'intervient pas ; seuls les codes des\ncaractères comptent.\n"
        }
      ],
      "explanation": "Comparer des chaînes revient à comparer les codes des caractères,\nposition par position. Trier des noms sans tenir compte de la casse\ndemande de les mettre d'abord en minuscules."
    },
    {
      "id": "q33",
      "difficulty": 2,
      "skills": [
        "ascii",
        "decodage"
      ],
      "title": "Trois codes à décoder",
      "partie": "ascii",
      "statement": "Un fichier texte contient trois octets dont les valeurs décimales\nsont $48, 49, 50$. Quel texte s'affiche à l'ouverture ?",
      "options": [
        {
          "text": "`012`",
          "correct": true,
          "feedback": "Bonne réponse : les chiffres commencent au code $48$, les\nmajuscules à $65$, les minuscules à $97$, chaque série se\npoursuivant d'une unité en une unité.\n"
        },
        {
          "text": "`ABC`",
          "correct": false,
          "feedback": "Erreur : cette série de caractères commence à un autre code de\nla table.\n"
        },
        {
          "text": "`abc`",
          "correct": false,
          "feedback": "Erreur : vérifie à quel code commence chaque série, chiffres,\nmajuscules ou minuscules.\n"
        },
        {
          "text": "`123`",
          "correct": false,
          "feedback": "Erreur : décalage d'une unité. Le premier code donné correspond\nau premier caractère de sa série.\n"
        }
      ],
      "explanation": "Trois repères suffisent pour lire la table ASCII de tête : `'0'`\nvaut $48$, `'A'` vaut $65$ et `'a'` vaut $97$.",
      "variants": [
        {
          "statement": "Un fichier texte contient trois octets dont les valeurs décimales\nsont $48, 49, 50$. Quel texte s'affiche à l'ouverture ?",
          "options": [
            {
              "text": "`012`",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres commencent au code $48$, les\nmajuscules à $65$, les minuscules à $97$, chaque série se\npoursuivant d'une unité en une unité.\n"
            },
            {
              "text": "`ABC`",
              "correct": false,
              "feedback": "Erreur : cette série de caractères commence à un autre code de\nla table.\n"
            },
            {
              "text": "`abc`",
              "correct": false,
              "feedback": "Erreur : vérifie à quel code commence chaque série, chiffres,\nmajuscules ou minuscules.\n"
            },
            {
              "text": "`123`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. Le premier code donné correspond\nau premier caractère de sa série.\n"
            }
          ],
          "explanation": "Trois repères suffisent pour lire la table ASCII de tête : `'0'`\nvaut $48$, `'A'` vaut $65$ et `'a'` vaut $97$."
        },
        {
          "statement": "Un fichier texte contient trois octets dont les valeurs décimales\nsont $65, 66, 67$. Quel texte s'affiche à l'ouverture ?",
          "options": [
            {
              "text": "`ABC`",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres commencent au code $48$, les\nmajuscules à $65$, les minuscules à $97$, chaque série se\npoursuivant d'une unité en une unité.\n"
            },
            {
              "text": "`012`",
              "correct": false,
              "feedback": "Erreur : cette série de caractères commence à un autre code de\nla table.\n"
            },
            {
              "text": "`abc`",
              "correct": false,
              "feedback": "Erreur : vérifie à quel code commence chaque série, chiffres,\nmajuscules ou minuscules.\n"
            },
            {
              "text": "`BCD`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. Le premier code donné correspond\nau premier caractère de sa série.\n"
            }
          ],
          "explanation": "Trois repères suffisent pour lire la table ASCII de tête : `'0'`\nvaut $48$, `'A'` vaut $65$ et `'a'` vaut $97$."
        },
        {
          "statement": "Un fichier texte contient trois octets dont les valeurs décimales\nsont $97, 98, 99$. Quel texte s'affiche à l'ouverture ?",
          "options": [
            {
              "text": "`abc`",
              "correct": true,
              "feedback": "Bonne réponse : les chiffres commencent au code $48$, les\nmajuscules à $65$, les minuscules à $97$, chaque série se\npoursuivant d'une unité en une unité.\n"
            },
            {
              "text": "`ABC`",
              "correct": false,
              "feedback": "Erreur : cette série de caractères commence à un autre code de\nla table.\n"
            },
            {
              "text": "`012`",
              "correct": false,
              "feedback": "Erreur : vérifie à quel code commence chaque série, chiffres,\nmajuscules ou minuscules.\n"
            },
            {
              "text": "`bcd`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité. Le premier code donné correspond\nau premier caractère de sa série.\n"
            }
          ],
          "explanation": "Trois repères suffisent pour lire la table ASCII de tête : `'0'`\nvaut $48$, `'A'` vaut $65$ et `'a'` vaut $97$."
        }
      ]
    },
    {
      "id": "q34",
      "difficulty": 1,
      "skills": [
        "python",
        "ord"
      ],
      "title": "Le code d'une minuscule avec ord",
      "partie": "python",
      "statement": "Que renvoie `ord(\"a\")` ?",
      "options": [
        {
          "text": "`97`",
          "correct": true,
          "feedback": "Bonne réponse : `ord` renvoie le code du caractère, et les\nminuscules occupent les codes $97$ à $122$.\n"
        },
        {
          "text": "`65`",
          "correct": false,
          "feedback": "Erreur : 65 est le code de la majuscule correspondante, $32$ de\nmoins que la minuscule.\n"
        },
        {
          "text": "`1`",
          "correct": false,
          "feedback": "Erreur : 1 est le rang de la lettre dans l'alphabet, pas son\ncode.\n"
        },
        {
          "text": "`96`",
          "correct": false,
          "feedback": "Erreur : décalage d'une unité, `'a'` vaut $97$.\n"
        }
      ],
      "explanation": "`ord` donne le code d'un caractère, `chr` fait l'inverse.",
      "variants": [
        {
          "statement": "Que renvoie `ord(\"a\")` ?",
          "options": [
            {
              "text": "`97`",
              "correct": true,
              "feedback": "Bonne réponse : `ord` renvoie le code du caractère, et les\nminuscules occupent les codes $97$ à $122$.\n"
            },
            {
              "text": "`65`",
              "correct": false,
              "feedback": "Erreur : 65 est le code de la majuscule correspondante, $32$ de\nmoins que la minuscule.\n"
            },
            {
              "text": "`1`",
              "correct": false,
              "feedback": "Erreur : 1 est le rang de la lettre dans l'alphabet, pas son\ncode.\n"
            },
            {
              "text": "`96`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité, `'a'` vaut $97$.\n"
            }
          ],
          "explanation": "`ord` donne le code d'un caractère, `chr` fait l'inverse."
        },
        {
          "statement": "Que renvoie `ord(\"b\")` ?",
          "options": [
            {
              "text": "`98`",
              "correct": true,
              "feedback": "Bonne réponse : `ord` renvoie le code du caractère, et les\nminuscules occupent les codes $97$ à $122$.\n"
            },
            {
              "text": "`66`",
              "correct": false,
              "feedback": "Erreur : 66 est le code de la majuscule correspondante, $32$ de\nmoins que la minuscule.\n"
            },
            {
              "text": "`2`",
              "correct": false,
              "feedback": "Erreur : 2 est le rang de la lettre dans l'alphabet, pas son\ncode.\n"
            },
            {
              "text": "`97`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité, `'a'` vaut $97$.\n"
            }
          ],
          "explanation": "`ord` donne le code d'un caractère, `chr` fait l'inverse."
        },
        {
          "statement": "Que renvoie `ord(\"z\")` ?",
          "options": [
            {
              "text": "`122`",
              "correct": true,
              "feedback": "Bonne réponse : `ord` renvoie le code du caractère, et les\nminuscules occupent les codes $97$ à $122$.\n"
            },
            {
              "text": "`90`",
              "correct": false,
              "feedback": "Erreur : 90 est le code de la majuscule correspondante, $32$ de\nmoins que la minuscule.\n"
            },
            {
              "text": "`26`",
              "correct": false,
              "feedback": "Erreur : 26 est le rang de la lettre dans l'alphabet, pas son\ncode.\n"
            },
            {
              "text": "`121`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité, `'a'` vaut $97$.\n"
            }
          ],
          "explanation": "`ord` donne le code d'un caractère, `chr` fait l'inverse."
        }
      ]
    },
    {
      "id": "q35",
      "difficulty": 2,
      "skills": [
        "python",
        "chr",
        "ord",
        "calcul"
      ],
      "title": "Une lettre obtenue par calcul",
      "partie": "python",
      "statement": "Que renvoie `chr(ord(\"A\") + 2)` ?",
      "options": [
        {
          "text": "`'C'`",
          "correct": true,
          "feedback": "Bonne réponse : `ord(\"A\")` vaut $65$, plus 2 donne $67$,\net `chr(67)` est la lettre `'C'`.\n"
        },
        {
          "text": "`'B'`",
          "correct": false,
          "feedback": "Erreur : décalage d'une unité ; $65 + 2 = 67$, qui est le\ncode de `'C'`.\n"
        },
        {
          "text": "`67`",
          "correct": false,
          "feedback": "Erreur : $67$ est le code calculé, mais `chr` le transforme\nen caractère.\n"
        },
        {
          "text": "`'A2'`",
          "correct": false,
          "feedback": "Erreur : l'addition porte sur le code, un entier, pas sur la\nchaîne.\n"
        }
      ],
      "explanation": "Combiner `ord` et `chr` permet de décaler des lettres, principe du\nchiffrement de César.",
      "variants": [
        {
          "statement": "Que renvoie `chr(ord(\"A\") + 2)` ?",
          "options": [
            {
              "text": "`'C'`",
              "correct": true,
              "feedback": "Bonne réponse : `ord(\"A\")` vaut $65$, plus 2 donne $67$,\net `chr(67)` est la lettre `'C'`.\n"
            },
            {
              "text": "`'B'`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité ; $65 + 2 = 67$, qui est le\ncode de `'C'`.\n"
            },
            {
              "text": "`67`",
              "correct": false,
              "feedback": "Erreur : $67$ est le code calculé, mais `chr` le transforme\nen caractère.\n"
            },
            {
              "text": "`'A2'`",
              "correct": false,
              "feedback": "Erreur : l'addition porte sur le code, un entier, pas sur la\nchaîne.\n"
            }
          ],
          "explanation": "Combiner `ord` et `chr` permet de décaler des lettres, principe du\nchiffrement de César."
        },
        {
          "statement": "Que renvoie `chr(ord(\"A\") + 5)` ?",
          "options": [
            {
              "text": "`'F'`",
              "correct": true,
              "feedback": "Bonne réponse : `ord(\"A\")` vaut $65$, plus 5 donne $70$,\net `chr(70)` est la lettre `'F'`.\n"
            },
            {
              "text": "`'E'`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité ; $65 + 5 = 70$, qui est le\ncode de `'F'`.\n"
            },
            {
              "text": "`70`",
              "correct": false,
              "feedback": "Erreur : $70$ est le code calculé, mais `chr` le transforme\nen caractère.\n"
            },
            {
              "text": "`'A5'`",
              "correct": false,
              "feedback": "Erreur : l'addition porte sur le code, un entier, pas sur la\nchaîne.\n"
            }
          ],
          "explanation": "Combiner `ord` et `chr` permet de décaler des lettres, principe du\nchiffrement de César."
        },
        {
          "statement": "Que renvoie `chr(ord(\"A\") + 25)` ?",
          "options": [
            {
              "text": "`'Z'`",
              "correct": true,
              "feedback": "Bonne réponse : `ord(\"A\")` vaut $65$, plus 25 donne $90$,\net `chr(90)` est la lettre `'Z'`.\n"
            },
            {
              "text": "`'Y'`",
              "correct": false,
              "feedback": "Erreur : décalage d'une unité ; $65 + 25 = 90$, qui est le\ncode de `'Z'`.\n"
            },
            {
              "text": "`90`",
              "correct": false,
              "feedback": "Erreur : $90$ est le code calculé, mais `chr` le transforme\nen caractère.\n"
            },
            {
              "text": "`'A25'`",
              "correct": false,
              "feedback": "Erreur : l'addition porte sur le code, un entier, pas sur la\nchaîne.\n"
            }
          ],
          "explanation": "Combiner `ord` et `chr` permet de décaler des lettres, principe du\nchiffrement de César."
        }
      ]
    },
    {
      "id": "q36",
      "difficulty": 2,
      "skills": [
        "python",
        "utf-8",
        "encode",
        "taille"
      ],
      "title": "La taille d'un mot accentué en UTF-8",
      "partie": "python",
      "statement": "Que renvoie `len(\"été\".encode(\"utf-8\"))` ?",
      "options": [
        {
          "text": "`4`",
          "correct": true,
          "feedback": "Bonne réponse : `encode` produit les octets du texte. Chaque\nlettre non accentuée occupe un octet et chaque lettre accentuée\ndeux, d'où 4 octets pour 3 caractères.\n"
        },
        {
          "text": "`3`",
          "correct": false,
          "feedback": "Erreur : 3 est le nombre de caractères, donné par\n`len(\"été\")`. En UTF-8, un caractère accentué occupe deux\noctets.\n"
        },
        {
          "text": "`6`",
          "correct": false,
          "feedback": "Erreur : seuls les caractères hors ASCII occupent deux octets,\npas tous.\n"
        },
        {
          "text": "`5`",
          "correct": false,
          "feedback": "Erreur : compte un octet par lettre ordinaire et deux par lettre\naccentuée.\n"
        }
      ],
      "explanation": "`len` d'une chaîne compte des caractères ; `len` de son encodage\ncompte des octets. En UTF-8 les deux diffèrent dès qu'un accent\napparaît.",
      "variants": [
        {
          "statement": "Que renvoie `len(\"été\".encode(\"utf-8\"))` ?",
          "options": [
            {
              "text": "`4`",
              "correct": true,
              "feedback": "Bonne réponse : `encode` produit les octets du texte. Chaque\nlettre non accentuée occupe un octet et chaque lettre accentuée\ndeux, d'où 4 octets pour 3 caractères.\n"
            },
            {
              "text": "`3`",
              "correct": false,
              "feedback": "Erreur : 3 est le nombre de caractères, donné par\n`len(\"été\")`. En UTF-8, un caractère accentué occupe deux\noctets.\n"
            },
            {
              "text": "`6`",
              "correct": false,
              "feedback": "Erreur : seuls les caractères hors ASCII occupent deux octets,\npas tous.\n"
            },
            {
              "text": "`5`",
              "correct": false,
              "feedback": "Erreur : compte un octet par lettre ordinaire et deux par lettre\naccentuée.\n"
            }
          ],
          "explanation": "`len` d'une chaîne compte des caractères ; `len` de son encodage\ncompte des octets. En UTF-8 les deux diffèrent dès qu'un accent\napparaît."
        },
        {
          "statement": "Que renvoie `len(\"café\".encode(\"utf-8\"))` ?",
          "options": [
            {
              "text": "`5`",
              "correct": true,
              "feedback": "Bonne réponse : `encode` produit les octets du texte. Chaque\nlettre non accentuée occupe un octet et chaque lettre accentuée\ndeux, d'où 5 octets pour 4 caractères.\n"
            },
            {
              "text": "`4`",
              "correct": false,
              "feedback": "Erreur : 4 est le nombre de caractères, donné par\n`len(\"café\")`. En UTF-8, un caractère accentué occupe deux\noctets.\n"
            },
            {
              "text": "`8`",
              "correct": false,
              "feedback": "Erreur : seuls les caractères hors ASCII occupent deux octets,\npas tous.\n"
            },
            {
              "text": "`7`",
              "correct": false,
              "feedback": "Erreur : compte un octet par lettre ordinaire et deux par lettre\naccentuée.\n"
            }
          ],
          "explanation": "`len` d'une chaîne compte des caractères ; `len` de son encodage\ncompte des octets. En UTF-8 les deux diffèrent dès qu'un accent\napparaît."
        },
        {
          "statement": "Que renvoie `len(\"naïve\".encode(\"utf-8\"))` ?",
          "options": [
            {
              "text": "`6`",
              "correct": true,
              "feedback": "Bonne réponse : `encode` produit les octets du texte. Chaque\nlettre non accentuée occupe un octet et chaque lettre accentuée\ndeux, d'où 6 octets pour 5 caractères.\n"
            },
            {
              "text": "`5`",
              "correct": false,
              "feedback": "Erreur : 5 est le nombre de caractères, donné par\n`len(\"naïve\")`. En UTF-8, un caractère accentué occupe deux\noctets.\n"
            },
            {
              "text": "`10`",
              "correct": false,
              "feedback": "Erreur : seuls les caractères hors ASCII occupent deux octets,\npas tous.\n"
            },
            {
              "text": "`9`",
              "correct": false,
              "feedback": "Erreur : compte un octet par lettre ordinaire et deux par lettre\naccentuée.\n"
            }
          ],
          "explanation": "`len` d'une chaîne compte des caractères ; `len` de son encodage\ncompte des octets. En UTF-8 les deux diffèrent dès qu'un accent\napparaît."
        }
      ]
    },
    {
      "id": "q37",
      "difficulty": 3,
      "skills": [
        "python",
        "ord",
        "calcul"
      ],
      "title": "Le rang d'une lettre dans l'alphabet",
      "partie": "python",
      "statement": "La variable `c` contient une lettre minuscule. Quelle expression\ndonne son rang dans l'alphabet, $1$ pour `'a'` et $26$ pour\n`'z'` ?",
      "options": [
        {
          "text": "`ord(c) - ord(\"a\") + 1`",
          "correct": true,
          "feedback": "Bonne réponse : la différence des codes donne $0$ pour `'a'`,\n$1$ pour `'b'`, et le `+ 1` ramène au rang attendu.\n"
        },
        {
          "text": "`ord(c) - ord(\"a\") - 1`",
          "correct": false,
          "feedback": "Erreur : cette expression vaut $-1$ pour `'a'` ; il faut ajouter\nune unité, pas la retrancher.\n"
        },
        {
          "text": "`ord(c) - 96 + 1`",
          "correct": false,
          "feedback": "Erreur : $97 - 96 + 1 = 2$ pour `'a'`, une unité de trop ;\nl'écart se calcule avec `ord(\"a\")`, qui vaut $97$.\n"
        },
        {
          "text": "`chr(c) - ord(\"a\") + 1`",
          "correct": false,
          "feedback": "Erreur : `chr` attend un entier, pas un caractère, et cette\nexpression provoque une erreur.\n"
        }
      ],
      "explanation": "Les lettres ayant des codes consécutifs, le rang d'une lettre est\nl'écart entre son code et celui de `'a'`, décalé d'une unité."
    },
    {
      "id": "q38",
      "difficulty": 3,
      "skills": [
        "python",
        "ord",
        "chr",
        "majuscule"
      ],
      "title": "Une majuscule obtenue par soustraction",
      "partie": "python",
      "statement": "Que renvoie `chr(ord(\"e\") - 32)` ?",
      "options": [
        {
          "text": "`'E'`",
          "correct": true,
          "feedback": "Bonne réponse : une minuscule a un code supérieur de $32$ à\ncelui de sa majuscule. Retrancher $32$ donne $69$, code de\n`'E'`.\n"
        },
        {
          "text": "`'e'`",
          "correct": false,
          "feedback": "Erreur : le code change, donc le caractère aussi.\n"
        },
        {
          "text": "`69`",
          "correct": false,
          "feedback": "Erreur : `chr` convertit le code $69$ en caractère.\n"
        },
        {
          "text": "Une erreur, un code ne pouvant être diminué",
          "correct": false,
          "feedback": "Erreur : `ord` renvoie un entier ordinaire, auquel on peut\nretrancher $32$.\n"
        }
      ],
      "explanation": "Passer de minuscule en majuscule revient à retrancher $32$ au code,\nce qu'illustre la différence `'a'` moins `'A'`.",
      "variants": [
        {
          "statement": "Que renvoie `chr(ord(\"e\") - 32)` ?",
          "options": [
            {
              "text": "`'E'`",
              "correct": true,
              "feedback": "Bonne réponse : une minuscule a un code supérieur de $32$ à\ncelui de sa majuscule. Retrancher $32$ donne $69$, code de\n`'E'`.\n"
            },
            {
              "text": "`'e'`",
              "correct": false,
              "feedback": "Erreur : le code change, donc le caractère aussi.\n"
            },
            {
              "text": "`69`",
              "correct": false,
              "feedback": "Erreur : `chr` convertit le code $69$ en caractère.\n"
            },
            {
              "text": "Une erreur, un code ne pouvant être diminué",
              "correct": false,
              "feedback": "Erreur : `ord` renvoie un entier ordinaire, auquel on peut\nretrancher $32$.\n"
            }
          ],
          "explanation": "Passer de minuscule en majuscule revient à retrancher $32$ au code,\nce qu'illustre la différence `'a'` moins `'A'`."
        },
        {
          "statement": "Que renvoie `chr(ord(\"n\") - 32)` ?",
          "options": [
            {
              "text": "`'N'`",
              "correct": true,
              "feedback": "Bonne réponse : une minuscule a un code supérieur de $32$ à\ncelui de sa majuscule. Retrancher $32$ donne $78$, code de\n`'N'`.\n"
            },
            {
              "text": "`'n'`",
              "correct": false,
              "feedback": "Erreur : le code change, donc le caractère aussi.\n"
            },
            {
              "text": "`78`",
              "correct": false,
              "feedback": "Erreur : `chr` convertit le code $78$ en caractère.\n"
            },
            {
              "text": "Une erreur, un code ne pouvant être diminué",
              "correct": false,
              "feedback": "Erreur : `ord` renvoie un entier ordinaire, auquel on peut\nretrancher $32$.\n"
            }
          ],
          "explanation": "Passer de minuscule en majuscule revient à retrancher $32$ au code,\nce qu'illustre la différence `'a'` moins `'A'`."
        },
        {
          "statement": "Que renvoie `chr(ord(\"z\") - 32)` ?",
          "options": [
            {
              "text": "`'Z'`",
              "correct": true,
              "feedback": "Bonne réponse : une minuscule a un code supérieur de $32$ à\ncelui de sa majuscule. Retrancher $32$ donne $90$, code de\n`'Z'`.\n"
            },
            {
              "text": "`'z'`",
              "correct": false,
              "feedback": "Erreur : le code change, donc le caractère aussi.\n"
            },
            {
              "text": "`90`",
              "correct": false,
              "feedback": "Erreur : `chr` convertit le code $90$ en caractère.\n"
            },
            {
              "text": "Une erreur, un code ne pouvant être diminué",
              "correct": false,
              "feedback": "Erreur : `ord` renvoie un entier ordinaire, auquel on peut\nretrancher $32$.\n"
            }
          ],
          "explanation": "Passer de minuscule en majuscule revient à retrancher $32$ au code,\nce qu'illustre la différence `'a'` moins `'A'`."
        }
      ]
    },
    {
      "id": "q39",
      "difficulty": 2,
      "skills": [
        "unicode",
        "utf-8",
        "emoji",
        "taille"
      ],
      "title": "La taille d'un émoji en UTF-8",
      "partie": "unicode",
      "statement": "Un émoji a pour point de code Unicode $1F600_{16}$, bien au-delà de\n$FFFF_{16}$. Sur combien d'octets est-il codé en UTF-8 ?",
      "options": [
        {
          "text": "$4$ octets",
          "correct": true,
          "feedback": "Bonne réponse : UTF-8 utilise $1$ octet jusqu'à $7F_{16}$, $2$\njusqu'à $7FF_{16}$, $3$ jusqu'à $FFFF_{16}$ et $4$ au-delà, ce\nqui est le cas des émojis.\n"
        },
        {
          "text": "$1$ octet",
          "correct": false,
          "feedback": "Erreur : un seul octet ne couvre que les $128$ caractères ASCII.\n"
        },
        {
          "text": "$2$ octets",
          "correct": false,
          "feedback": "Erreur : deux octets couvrent les caractères accentués européens,\npas les émojis.\n"
        },
        {
          "text": "$3$ octets",
          "correct": false,
          "feedback": "Erreur : trois octets s'arrêtent à $FFFF_{16}$ ; les émojis sont\nau-delà.\n"
        }
      ],
      "explanation": "UTF-8 est un codage à longueur variable : plus le point de code est\ngrand, plus il occupe d'octets, jusqu'à quatre."
    },
    {
      "id": "q40",
      "difficulty": 3,
      "skills": [
        "unicode",
        "utf-8",
        "decodage",
        "erreur"
      ],
      "title": "Un accent devenu deux symboles",
      "partie": "unicode",
      "statement": "Un fichier UTF-8 contenant « été » est ouvert avec un logiciel\nréglé sur un codage à un octet par caractère. Il affiche\n« Ã©tÃ© ». Que s'est-il passé ?",
      "options": [
        {
          "text": "Chaque `é`, sur deux octets en UTF-8, a été lu comme deux caractères",
          "correct": true,
          "feedback": "Bonne réponse : `é` s'écrit $C3_{16}$ $A9_{16}$ en UTF-8. Lus\nun par un dans un codage à un octet, ces octets donnent `Ã` et\n`©`.\n"
        },
        {
          "text": "Le fichier a été endommagé pendant la copie, deux octets ayant été altérés",
          "correct": false,
          "feedback": "Erreur : les octets sont intacts, c'est leur interprétation qui\ndiffère. Le fichier s'affiche correctement en UTF-8.\n"
        },
        {
          "text": "Le logiciel a remplacé les accents par des symboles aléatoires",
          "correct": false,
          "feedback": "Erreur : rien n'est aléatoire, chaque `é` donne toujours la\nmême paire de symboles.\n"
        },
        {
          "text": "Le texte avait été écrit avec des caractères spéciaux par erreur",
          "correct": false,
          "feedback": "Erreur : le texte d'origine est correct ; seul le choix du\ncodage à l'ouverture est en cause.\n"
        }
      ],
      "explanation": "Un texte n'a de sens qu'avec son codage. Le même fichier lu en\nUTF-8 ou en Latin-1 donne des caractères différents dès qu'un\naccent apparaît."
    }
  ]
}