{
  "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 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": "Parce qu'il est rétro-compatible avec ASCII et de taille variable selon les caractères",
          "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": "Plus d'un million",
          "correct": true,
          "feedback": "Bonne réponse : Unicode peut référencer jusqu'à\n$1\\ 114\\ 112$ 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 contient en plus des informations de mise en forme (police, taille, couleur, etc.)",
          "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 codé en Unicode obligatoirement",
          "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": [
        "html",
        "definition"
      ],
      "title": "Signification du sigle HTML",
      "statement": "Que signifie l'acronyme HTML ?",
      "options": [
        {
          "text": "High-level Text Manipulation Language",
          "correct": false,
          "feedback": "Erreur : sigle inventé. HTML n'est pas un langage de\nmanipulation de texte mais un langage de balisage.\n"
        },
        {
          "text": "Hypothetical Text Macro Library",
          "correct": false,
          "feedback": "Erreur : sigle inventé.\n"
        },
        {
          "text": "Hyper Type Modern Language",
          "correct": false,
          "feedback": "Erreur : sigle inventé. La vraie signification commence\npar « HyperText ».\n"
        },
        {
          "text": "HyperText Markup Language",
          "correct": true,
          "feedback": "Bonne réponse : c'est le langage à balises pour les pages\nweb, créé par Tim Berners-Lee en $1989$ au CERN. Le mot\n*hypertext* renvoie aux **liens** entre documents.\n"
        }
      ],
      "explanation": "HTML est l'un des trois piliers du Web (avec CSS et\nJavaScript). Son rôle : décrire la **structure** d'un\ndocument (titres, paragraphes, liens, images), tandis que CSS\ngère l'apparence et JavaScript gère l'interactivité."
    },
    {
      "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 peut pas représenter 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": "Parce qu'il consomme quatre octets par caractère, même pour les caractères ASCII très fréquents",
          "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",
          "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": "L'utilisation du huitième bit (mis à $0$ dans l'ASCII standard) 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 et indiquent au navigateur comment afficher le texte",
          "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 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": "q20",
      "difficulty": 2,
      "skills": [
        "tex",
        "latex"
      ],
      "title": "Particularité de TeX/LaTeX",
      "statement": "Quel est le **point fort** de TeX/LaTeX, créé par Donald Knuth\nen $1977$, par rapport aux traitements de texte WYSIWYG ?",
      "options": [
        {
          "text": "Il produit une mise en page typographique de très haute qualité, particulièrement pour les équations mathématiques",
          "correct": true,
          "feedback": "Bonne réponse : TeX a été créé pour résoudre les\nproblèmes de qualité d'impression des publications\nscientifiques. Il reste le standard de l'édition\nscientifique aujourd'hui encore.\n"
        },
        {
          "text": "Il génère du HTML directement",
          "correct": false,
          "feedback": "Erreur : TeX produit principalement du PDF (via DVI ou\ndirectement). Des outils tiers existent pour convertir,\nmais ce n'est pas la finalité de TeX.\n"
        },
        {
          "text": "Il est compatible avec Microsoft Word",
          "correct": false,
          "feedback": "Erreur : TeX et Word sont des écosystèmes très différents.\nLa conversion entre les deux est généralement complexe et\nincomplète.\n"
        },
        {
          "text": "Il permet de modifier le texte directement à l'écran",
          "correct": false,
          "feedback": "Erreur : c'est précisément le contraire. TeX repose sur\nun langage de balisage compilé : on écrit le code source\npuis on le compile pour obtenir le PDF. C'est le mode\nopposé du WYSIWYG.\n"
        }
      ],
      "explanation": "LaTeX (la couche la plus utilisée au-dessus de TeX) reste\nirremplaçable pour les documents scientifiques, les thèses,\nles cours, les présentations Beamer, etc. Sa philosophie\n« écrire le contenu, laisser la mise en forme à l'outil »\ngarantit une excellente qualité typographique."
    },
    {
      "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": "Pour unifier les nombreuses tables d'ASCII étendu (Latin-1, Latin-2, etc.) qui rendaient l'échange international de fichiers difficile",
          "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": "q23",
      "difficulty": 3,
      "skills": [
        "formats",
        "comparaison"
      ],
      "title": "Différence entre HTML et OpenDocument",
      "statement": "Quelle est la principale différence entre **HTML** et\n**OpenDocument** (le format `.odt` de LibreOffice) ?",
      "options": [
        {
          "text": "HTML est propriétaire, OpenDocument est libre",
          "correct": false,
          "feedback": "Erreur : HTML est un standard ouvert (W3C), pas\npropriétaire. OpenDocument est aussi un standard ouvert.\n"
        },
        {
          "text": "HTML est un format binaire, OpenDocument est textuel",
          "correct": false,
          "feedback": "Erreur : HTML et OpenDocument sont tous deux des formats\ntextuels. OpenDocument est en réalité un fichier ZIP\ncontenant des fichiers XML.\n"
        },
        {
          "text": "HTML est destiné à l'affichage web ; OpenDocument est conçu pour les documents bureautiques",
          "correct": true,
          "feedback": "Bonne réponse : les deux utilisent des balises XML, mais\nleurs finalités diffèrent. HTML décrit des pages web\ninteractives ; OpenDocument décrit des documents\nimprimables (texte, tableur, présentation), avec une\ngestion fine de la pagination.\n"
        },
        {
          "text": "OpenDocument est rétro-compatible avec ASCII, pas HTML",
          "correct": false,
          "feedback": "Erreur : la rétrocompatibilité ASCII concerne l'encodage\nde caractères (UTF-$8$), pas le format de document.\n"
        }
      ],
      "explanation": "Les deux formats sont structurés en balises XML. HTML est\nadapté à des contenus dynamiques (liens, scripts, vidéos),\nOpenDocument à des documents imprimables (mise en page\nfigée, pagination, marges). Ils ne sont pas interchangeables."
    },
    {
      "id": "q24",
      "difficulty": 3,
      "skills": [
        "encodage",
        "mojibake"
      ],
      "title": "Mojibake et erreurs de décodage",
      "statement": "Vous ouvrez un fichier `texte.txt` qui contient le mot français\n« café », mais vous voyez s'afficher « cafÃ© ». Quelle est la\ncause la plus probable ?",
      "options": [
        {
          "text": "Le fichier utilise un mauvais saut de ligne (Windows vs Unix)",
          "correct": false,
          "feedback": "Erreur : les sauts de ligne n'affectent pas l'affichage\ndes caractères, seulement la disposition en lignes.\n"
        },
        {
          "text": "Le fichier est en UTF-$8$ mais affiché comme s'il était en Latin-$1$ (ISO-$8859$-$1$)",
          "correct": true,
          "feedback": "Bonne réponse : c'est le scénario typique de *mojibake*.\nEn UTF-$8$, 'é' est codé `0xC3 0xA9`. Lus comme du\nLatin-$1$, ces deux octets affichent 'Ã' suivi de '©'.\n"
        },
        {
          "text": "Le fichier est corrompu",
          "correct": false,
          "feedback": "Erreur : la corruption produirait des caractères vraiment\naléatoires. Ici l'altération est systématique sur les\naccents, ce qui est typique d'une mauvaise interprétation\ndu codage.\n"
        },
        {
          "text": "Le fichier est en ASCII pur",
          "correct": false,
          "feedback": "Erreur : un fichier ASCII pur ne contient pas d'accents.\nLe 'é' nécessite déjà un encodage qui sort de l'ASCII.\n"
        }
      ],
      "explanation": "Le mojibake est l'erreur d'affichage la plus classique en\ngestion de l'encodage. Les outils modernes détectent de mieux\nen mieux le bon encodage, mais en cas de doute il faut\nexplicitement préciser l'encodage à l'ouverture (en Python :\n`open(fichier, encoding=\"utf-8\")`)."
    },
    {
      "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": "Parce qu'UTF-$8$ a été conçu pour reproduire à l'identique le codage des $128$ caractères ASCII (un seul octet, bit de poids fort à $0$)",
          "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": "q27",
      "difficulty": 3,
      "skills": [
        "utf-8",
        "grammaire"
      ],
      "title": "Marqueur d'un octet de continuation en UTF-8",
      "statement": "En UTF-$8$, dans une séquence multi-octets, quels sont les\nbits de tête qui marquent un **octet de continuation**\n(deuxième, troisième ou quatrième octet d'un caractère) ?",
      "options": [
        {
          "text": "`1110xxxx`",
          "correct": false,
          "feedback": "Erreur : ce schéma marque le premier octet d'un caractère\ncodé sur trois octets. Les octets de continuation qui le\nsuivent commencent quant à eux par `10`.\n"
        },
        {
          "text": "`0xxxxxxx`",
          "correct": false,
          "feedback": "Erreur : ce schéma désigne un caractère ASCII codé sur un\nseul octet (point de code de $0$ à $127$), pas un octet\nde continuation.\n"
        },
        {
          "text": "`10xxxxxx`",
          "correct": true,
          "feedback": "Bonne réponse : tout octet de continuation commence par\nles bits `10`, suivis de six bits utiles. Cette signature\npermet de repérer immédiatement un octet « du milieu »\ndans une séquence UTF-$8$.\n"
        },
        {
          "text": "`110xxxxx`",
          "correct": false,
          "feedback": "Erreur : ce schéma marque le **premier** octet d'un\ncaractère codé sur deux octets, pas un octet de\ncontinuation.\n"
        }
      ],
      "explanation": "Grammaire UTF-$8$ : un octet ASCII commence par `0`, un\npremier octet multi-octets commence par autant de `1` que\nd'octets dans la séquence (`110`, `1110`, `11110`), puis\ntous les octets suivants commencent par `10`. Cette\nstructure auto-synchronisante permet de reconnaître la\nposition d'un octet sans relire le flux depuis le début."
    },
    {
      "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, retour chariot, tabulation, etc.) qui pilotent le terminal ou la transmission",
          "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\nUnicode** (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$."
    }
  ]
}