{
  "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).",
    "prerequisites": [],
    "references": []
  },
  "questions": [
    {
      "id": "q01",
      "difficulty": 1,
      "skills": [
        "ascii",
        "definition"
      ],
      "title": "Définition d'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",
      "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'",
      "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",
      "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": "Point de code Unicode",
      "statement": "Comment écrit-on conventionnellement un point de code Unicode ?",
      "options": [
        {
          "text": "`U+0041`",
          "correct": true,
          "feedback": "Bonne réponse : la notation officielle est `U+xxxx` avec\nun code hexadécimal de $4$ à $6$ chiffres. Par exemple\n`U+0041` désigne la lettre A majuscule.\n"
        },
        {
          "text": "`\\u0041`",
          "correct": false,
          "feedback": "Erreur : c'est la **séquence d'échappement** utilisée dans\ncertains langages de programmation, pas la notation\nstandard du Consortium Unicode.\n"
        },
        {
          "text": "`0x41`",
          "correct": false,
          "feedback": "Erreur : c'est la notation hexadécimale Python pour\nl'entier $65$, mais ce n'est pas la convention Unicode.\n"
        },
        {
          "text": "`UC-0041`",
          "correct": false,
          "feedback": "Erreur : ce préfixe n'existe pas. La convention Unicode\nest `U+`.\n"
        }
      ],
      "explanation": "La notation `U+xxxx` s'écrit toujours en hexadécimal et\nfonctionne pour des points de code de $4$ à $6$ chiffres\n(de `U+0000` à `U+10FFFF`)."
    },
    {
      "id": "q06",
      "difficulty": 1,
      "skills": [
        "utf",
        "definition"
      ],
      "title": "Caractéristique principale d'UTF-8",
      "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",
      "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",
      "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é est utilisée dans certains algorithmes pour\nbasculer la casse efficacement : `code ^= 32` change la casse\nen un coup grâce au XOR. C'est aussi pour ça que les codes\nsont contigus et organisés par casse."
    },
    {
      "id": "q09",
      "difficulty": 1,
      "skills": [
        "enrichi",
        "balises"
      ],
      "title": "Texte enrichi vs texte simple",
      "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",
      "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",
      "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$, qui correspond à un caractère\nde contrôle (SOH), pas à 'A'.\n"
        },
        {
          "text": "$01100001$",
          "correct": false,
          "feedback": "Erreur : c'est le code $97 = 64 + 32 + 1$, 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."
    },
    {
      "id": "q12",
      "difficulty": 2,
      "skills": [
        "decodage",
        "ascii"
      ],
      "title": "Décoder un texte ASCII",
      "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$.\nLa spécialité s'écrit donc bien $NSI$.\n"
        },
        {
          "text": "`nsi`",
          "correct": false,
          "feedback": "Erreur : ce sont les majuscules. Les minuscules\ncorrespondantes seraient $110, 115, 105$.\n"
        },
        {
          "text": "`123`",
          "correct": false,
          "feedback": "Erreur : confusion entre les codes ASCII et les chiffres\neux-mêmes. Les chiffres `'1'`, `'2'`, `'3'` ont les codes\nASCII $49, 50, 51$.\n"
        },
        {
          "text": "`abc`",
          "correct": false,
          "feedback": "Erreur : `a` vaut $97$ et non $78$. Vérifier la table\nASCII : les majuscules sont vers $65$, les minuscules\nvers $97$.\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$."
    },
    {
      "id": "q13",
      "difficulty": 2,
      "skills": [
        "utf-8",
        "taille"
      ],
      "title": "Taille d'un caractère en UTF-8",
      "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",
      "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$ supporte tous les caractères Unicode,\nemojis compris (et même mieux qu'UTF-$16$ qui doit gérer\nles paires de substitution).\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",
      "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",
      "statement": "Que renvoie le code Python suivant ?\n\n```\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 : on a peut-être confondu A et @ ($64$). $A$ a\npour code $65$, donc $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": "Cette construction est très utile pour calculer des sommes ou\ndes hash sur des chaînes : on parcourt caractère par\ncaractère et on combine leurs codes ASCII."
    },
    {
      "id": "q17",
      "difficulty": 2,
      "skills": [
        "encodage",
        "accent"
      ],
      "title": "Codage des caractères accentués",
      "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",
      "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",
      "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. Pour la\nréutilisation, il faut passer par CSS, JavaScript ou un\nmoteur de templates.\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.\nLes attributs (`id`, `class`, `href`, etc.) précisent le\ncomportement ou le style. La structure complète forme l'arbre\nDOM (Document Object Model)."
    },
    {
      "id": "q21",
      "difficulty": 3,
      "skills": [
        "unicode",
        "motivation"
      ],
      "title": "Motivation historique d'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",
      "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 : 'N', 'S' et 'I' sont des caractères ASCII,\ncodés chacun sur $1$ octet en UTF-$8$. Total : $3$ octets.\n"
        },
        {
          "text": "$1$ octet",
          "correct": false,
          "feedback": "Erreur : un seul octet code un seul caractère ASCII, pas\nune chaîne de trois 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$, on est trois fois plus économique\npour cette chaîne.\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é."
    },
    {
      "id": "q25",
      "difficulty": 3,
      "skills": [
        "retro-compatibilite",
        "utf-8"
      ],
      "title": "Rétrocompatibilité d'UTF-8",
      "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",
      "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",
      "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\npour piloter les terminaux mécaniques (téléimprimeurs). Ils\nrestent essentiels aujourd'hui pour structurer le texte\n(sauts de ligne, tabulations) et signaler la fin d'une\nchaîne en C (caractère nul `\\0`)."
    },
    {
      "id": "q29",
      "difficulty": 3,
      "skills": [
        "unicode",
        "utf-8",
        "longueur",
        "python"
      ],
      "title": "Longueur d'une chaîne accentuée en Python",
      "statement": "En Python $3$, les deux instructions du code suivant\naffichent-elles la même valeur ?\n\n```python\ntexte = \"café\"\nprint(len(texte))\nprint(len(texte.encode(\"utf-8\")))\n```",
      "options": [
        {
          "text": "Oui, les deux affichent $5$",
          "correct": false,
          "feedback": "Erreur : `len(texte)` compte les caractères Unicode, pas\nles octets. Pour `\"café\"` (quatre caractères), cela\naffiche $4$.\n"
        },
        {
          "text": "Oui, les deux affichent $4$",
          "correct": false,
          "feedback": "Erreur : seule la première instruction affiche $4$.\nComme `é` occupe deux octets en UTF-$8$, l'encodage\nbinaire de `\"café\"` fait $5$ octets, pas $4$.\n"
        },
        {
          "text": "Non, $4$ pour la première et $5$ pour la seconde",
          "correct": true,
          "feedback": "Bonne réponse : `len(texte)` compte les **caractères Unicode** (ici $4$ : `c`, `a`, `f`, `é`), tandis que\n`len(texte.encode(\"utf-8\"))` compte les **octets** après\nencodage (ici $5$, car `é` occupe deux octets).\n"
        },
        {
          "text": "Non, $5$ pour la première et $4$ pour la seconde",
          "correct": false,
          "feedback": "Erreur : c'est l'inverse. Une chaîne Unicode est toujours\nau moins aussi courte (en caractères) que sa version\nencodée (en octets), jamais plus longue.\n"
        }
      ],
      "explanation": "Distinction fondamentale : un objet `str` en Python $3$ est\nune suite de **points de code Unicode**, pas d'octets. La\nméthode `encode` produit un objet `bytes` qui peut être plus\nlong si le texte contient des caractères non ASCII. Cette\nséparation entre texte et octets évite la plupart des bugs\nde manipulation rencontrés en Python $2$."
    }
  ]
}