Applications des chaînes de caractères

Applications 1 à 5 : manipulation des chaînes de caractères

Applications 6 à 9 : encodage des chaînes de caractères

 

Application 1 : mise en majuscules

Proposez un programme qui demande une chaîne de caractères à l'utilisateur, puis qui affiche la chaîne entièrement en MAJUSCULES.

Exemple :

Si l'utilisateur saisie la chaîne Je programme en Python

votre programme doit afficher JE PROGRAMME EN PYTHON

 

 

Application 2 : mise en minuscules

Proposez un programme qui demande une chaîne de caractères à l'utilisateur, puis qui affiche la chaîne entièrement en minuscules.

Exemple :

Si l'utilisateur saisie la chaîne JE PROGRAMME EN PYTHON

votre programme doit afficher je programme en python

Autre exemple :

Si l'utilisateur saisie la chaîne Je programme en Python

votre programme doit afficher je programme en python

 

Application 3 : inversion d'une chaîne

Proposez un programme qui demande une chaîne de caractères à l'utilisateur, puis qui affiche la chaîne de caractère à l'envers, c'est-à-dire en inversant l'ordre des caractères.

Exemple :

Si l'utilisateur saisie la chaîne Je programme en Python

votre programme doit afficher nohtyP ne emmargorp eJ

Remarque : la chaîne inversée doit être affichée sur une seule ligne (et non un caractère par ligne).

 

Application 4 : des mots et des lettres

Proposez un programme qui demande une chaîne de caractères à l'utilisateur, puis qui affiche le nombre de caractères, le nombre de lettres, le nombre de mots et le nombre d'espaces contenus dans la phrase saisie.

Exemple :

Si l'utilisateur saisie la chaîne Je programme en Python

votre programme doit afficher : cette chaîne de caractère contient 22 caractères, 19 lettres, 4 mots et 3 espaces

 

Application 5 : analyse d'une phrase

Voici une chaîne de caractères représentant une phrase :

phrase="Le travail de la pensée ressemble au forage d’un puits ; l'eau est trouble d'abord, puis elle se clarifie."

Copier cette ligne dans un nouveau programme Python puis améliorer votre programme afin d'afficher petit à petit les informations suivantes :

1 - Afficher la phrase entière.

2 - Afficher le nombre de caractères utilisés dans la phrase.

3 - Afficher le nombre de mots composant cette phrase.

4 - Afficher le nombre d'espace présent dans cette phrase.

5 - Afficher le nombre de caractères de ponctuation présent dans cette phrase.

6 - Afficher le nombre de lettres présent dans cette phrase.

7 - Afficher les lettres de l'alphabet qui ne sont pas présentes dans cette phrase.

8 - Afficher le nombre de voyelles et le nombre de consonnes présents dans cette phrase.

 

 

Application 6 : encodage des caractères

1 - Proposez un programme qui affiche les caractères n°128 à n°255 et leur code en utilisant le jeu de caractères cp1252. Comparez votre résultat à la table ASCII étendue ANSI.

Exemple d'affichage attendu dans la console :

130 : ‚
131 : ƒ
132 : „
133 : …
134 : †
135 : ‡
136 : ˆ
137 : ‰
138 : Š
139 : ‹

Problème : le jeu de caractères cp1252 n'est pas complet : certains caractères sont inexistants. C'est le cas par exemple du caractère 0x81 : aucun caractère possédant le numéro 0x81 n'est présent dans la table de caractères cp1252. Si on demande à Python de décoder le code '\x81' en utilisant la table ASCII étendue cp1252 il renvoie une erreur indiquant clairement qu'il ne peut pas décoder la valeur 0x81 avec cette page de code :

>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\Program Files\EduPython\App\lib\encodings\cp1252.py", line 15, in decode
  return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>

Solution : pour éviter cette erreur il faut passer un second paramètre de valeur 'ignore' à la méthode decode(). Ainsi si le caractère n'existe pas la méthode decode() renvoie une chaîne vide et ne provoque plus d'erreur :

>>> b'\x81'.decode('cp1252','ignore')
''

Et si le caractère existe elle retourne bien le bon caractère. Exemple avec le caractère 'copyright' de code 0xA9 :

>>> b'\xa9'.decode('cp1252','ignore')
'©'

Il est alors possible de savoir si le caractère existe (chaîne renvoyée non vide) ou n'existe pas (chaîne vide renvoyée) en testant le retour de la méthode decode().

Voici par exemple un programme qui recherche tous les caractères "vides" de la page de code cp1252 :

i=0
for n in range(0,255+1):
      ch_b=n.to_bytes(1,'big')
      ch_s=ch_b.decode('cp1252','ignore')
      if ch_s=='':
            print("Le caractère n°%d n'existe pas dans la table cp1252" % n)
            i=i+1

print("Il y a %d caractères vides dans la table cp1252" % i)

 

 

2 - Proposez un programme qui affiche les caractères n°128 à n°255 et leur code en utilisant le jeu de caractères cp437. Comparez votre résultat à la table ASCII étendue OEM.

3 - Les jeux de caractères suivants sont "similaires" et correspondent en grande partie à "la table ASCII étendue ANSI" :

  • latin
  • cp1252
  • iso8859
  • iso8859-15

Mais tous ces jeux de caractères sont-ils en tout point identiques ? Pour y répondre nous allons les comparer afin d'en extraire les différences. Pour cela nous allons utiliser les ensembles. En effet, si nous créons un ensemble par page de code, il est ensuite très facile d'en faire ressortir les points communs ou les différences grâce aux opérateurs de Python appliqués aux ensembles (intersection, union, différence symétrique et différence).

Exemple : quelles sont les différences entre les jeux de caractères iso8859 et iso8859-15 ?

Pour le savoir nous allons créer 2 ensembles : e1 pour la page de code iso8859 et e2 pour la page de code iso8859-15. Mais que mettre dans ces ensembles ? Les caractères seuls ? Les codes numériques seuls ? Ou les deux ? En fait nos avons besoin d'un couple de données rassemblant un caractère et son code numérique. Pour cela nous allons utiliser des tuples. Chaque ensemble contiendra 256 tuples correspondant aux 256 caractères de la page de code avec leur valeur numérique.

Créons l'ensemble e1 contenant 256 typles correspondant à la page de code iso8859 :

e1=set()

for n in range(0,255+1):
      ch_b=n.to_bytes(1,'big')
      ch_s=ch_b.decode('iso8859','ignore')
      e1.add((n,ch_s))

Créons l'ensemble e2 contenant 256 typles correspondant à la page de code iso8859-15 :

e2=set()

for n in range(0,255+1):
      ch_b=n.to_bytes(1,'big')
      ch_s=ch_b.decode('iso8859-15','ignore')
      e2.add((n,ch_s))

On peut désormais facilement afficher les différences entre ces deux pages de code grâce aux opérateurs sur les ensembles :

Les caractères différents entre iso8859 et iso8859-15 :

>>> e1^e2
{(164, '¤'),
(164, '€'),
(166, '¦'),
(166, 'Š'),
(168, '¨'),
(168, 'š'),
(180, '´'),
(180, 'Ž'),
(184, '¸'),
(184, 'ž'),
(188, '¼'),
(188, 'Œ'),
(189, '½'),
(189, 'œ'),
(190, '¾'),
(190, 'Ÿ')}

Les caractères de iso8859 qui ne sont pas dans iso8859-15 :

>>> e1-e2
{(164, '¤'),
(166, '¦'),
(168, '¨'),
(180, '´'),
(184, '¸'),
(188, '¼'),
(189, '½'),
(190, '¾')}

Les caractères de iso8859-15 qui ne sont pas dans iso8859 :

>>> e2-e1
{(164, '€'),
(166, 'Š'),
(168, 'š'),
(180, 'Ž'),
(184, 'ž'),
(188, 'Œ'),
(189, 'œ'),
(190, 'Ÿ')}

Comme les ensembles ne sont pas ordonnés, il est possible que l'affichage ne soit pas dans l'ordre des codes numériques. Pour forcer un affichage ordonné selon les codes des caractères il faut convertir les ensembles en liste, trier les listes dans l'ordre croissant, puis afficher la liste triée.

Voici le programme complet qui compare les jeux de caractères iso8859 et iso8859-15 en affichant les résultats sous forme de listes ordonnées :

# Comparaison des jeux de caractères iso8859 et iso8859-15 grâce aux ensembles

e1=set()
e2=set()

for n in range(0,255+1):
      ch_b=n.to_bytes(1,'big')
      ch_s=ch_b.decode('iso8859','ignore')
      e1.add((n,ch_s))

for n in range(0,255+1):
      ch_b=n.to_bytes(1,'big')
      ch_s=ch_b.decode('iso8859-15','ignore')
      e2.add((n,ch_s))

# Affiche seulement les caractères différents :

print("Il y a %d différences entre iso8859 et iso8859-15. Les voici :" % len(e1^e2))

print('\nLes caractères différents entre iso8859 et iso8859-15 :')
liste=list(e1^e2)
liste.sort()
print(liste)

print('\nLes caractères de iso8859 qui ne sont pas dans iso8859-15 :')
liste=list(e1-e2)
liste.sort()
print(liste)

print('\nLes caractères de iso8859-15 qui ne sont pas dans iso8859 :')
liste=list(e2-e1)
liste.sort()
print(liste)

Et voici le résultat de ce programme affiché dans la console :

Il y a 16 différences entre iso8859 et iso8859-15. Les voici :

Les caractères différents entre iso8859 et iso8859-15 :
[(164, '¤'), (164, '€'), (166, '¦'), (166, 'Š'), (168, '¨'), (168, 'š'), (180, '´'), (180, 'Ž'), (184, '¸'), (184, 'ž'), (188, '¼'), (188, 'Œ'), (189, '½'), (189, 'œ'), (190, '¾'), (190, 'Ÿ')]

Les caractères de iso8859 qui ne sont pas dans iso8859-15 :
[(164, '¤'), (166, '¦'), (168, '¨'), (180, '´'), (184, '¸'), (188, '¼'), (189, '½'), (190, '¾')]

Les caractères de iso8859-15 qui ne sont pas dans iso8859 :
[(164, ''), (166, 'Š'), (168, 'š'), (180, 'Ž'), (184, 'ž'), (188, 'Œ'), (189, 'œ'), (190, 'Ÿ')]

On constate qu'il y a 8 caractères différents entre les pages de code iso8859 et iso8859-15.

Cette comparaison des jeux de caractères iso8859 et iso8859-15 nous montre une amélioration fondamendale de cette page de code (en rouge ci-dessus et à noter) : dans la version iso8859-15 les caractère Euro (), e dans l'eau majuscule (Œ) et e dans l'o minuscule (œ) ont été rajoutés en ramplacement d'anciens caractères qui n'étaient pas utilisés : ces 3 caractères , Œ et œ n'esistaient pas dans la version iso8859.

 

Proposez un programme qui affiche seulement les caractères différents entre la page de code 'cp1252' et la page de code 'latin' (le même code numérique ne donne pas le même caractère dans les deux pages de code).

Proposez un programme qui affiche seulement les caractères différents entre la page de code 'cp1252' et la page de code 'iso8859'.

Proposez un programme qui affiche seulement les caractères différents entre la page de code 'cp1252' et la page de code 'iso8859-15'.

Quelles sont les différences entre les jeux de caractères iso8859 et iso8859-15 ?

Relevez par écrit et retenez le nombre de différences qu'il existe entre ces différents jeux de caractères.

 

4 - Comment se code le caractère € (symbole monétaire de l'Euro) avec les les jeux de caractères suivants :

  • latin
  • cp1252
  • iso8859
  • iso8859-15
  • cp437
  • cp850
  • mac-roman

5 - Quelles sont les différences entre les pages de code cp850 (utilisée en Europe) et cp437 (utilisée en Amérique) ?

  • combien ont-elles de caractères en commun (même code et même caractère) ?
  • combien ont-elles de caractères déplacés (caractère présent dans les 2 tables mais avec un code différent) ?
  • combien ont-elle de caractères uniques (caractère présent dans une seule des 2 tables et pas dans l'autre) ?

Relevez par écrit et retenez le nombre de différences qu'il existe entre ces différents jeux de caractères.

 

Application 7 : affichage d'un caractère quelconque

En appuyant sur la touche Alt du clavier et en saisissant le code d'un caractère en décimal sur le pavé numérique le caractère s'affiche dans la console de Python (ou dans un éditeur de texte).

Par exemple si on tape Alt-65 on affiche le caractère A, car le code ASCII en décimal du caractère A est 65.

Cette méthode de saisie alternative permet de saisir les milliers de nouveaux caractères en plus des caractères directs qui sont imprimés sur le clavier à partir du moment où on connaît leur code numérique en décimal. Le "Alt" de la touche Alt signifie justement "Alternative".

Grâce à la touche Alt du clavier, Windows effectue alors un décodage : il convertit une valeur numérique en un caractère.

Or pour tout décodage il faut utiliser un jeu de caractères bien défini.

Mais quel jeu de caractères est utilisé lorsqu'on saisie un code par la méthode alternative ? Vous ferez plusieurs essais dans les intervalles de codes suivants en utilisant soit les tables ASCII étendues sur papier soit Python pour vérifier vos résultats et pour conclure en complétant et en relevant les phrases suivantes :

  • entre 20 et 127 le jeu de caractères utilisé par la touche Alt est ...........................................
  • entre 128 et 224 le jeu de caractères utilisé par la touche Alt est ...........................................
  • entre 225 et 255 le jeu de caractères utilisé par la touche Alt est ...........................................
  • entre 256 et 1000 le jeu de caractères utilisé par la touche Alt est ...........................................
  • entre 1000 et 5000 le jeu de caractères utilisé par la touche Alt est ...........................................
  • entre 5000 et 10 000 le jeu de caractères utilisé par la touche Alt est ...........................................

Suite de l'expérience, à réaliser toujours dans la console de Python :

  • tapez Alt-128 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 128 ?
  • tapez Alt-0128 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 128 ?
  • tapez Alt-131 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 131 ?
  • tapez Alt-0131 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 131 ?
  • tapez Alt-140 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 140 ?
  • tapez Alt-0140 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 140 ?
  • tapez Alt-156 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 156 ?
  • tapez Alt-0156 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 156 ?
  • tapez Alt-169 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 169 ?
  • tapez Alt-0169 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 169 ?
  • tapez Alt-171 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 171 ?
  • tapez Alt-0171 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 171 ?
  • tapez Alt-189 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 189 ?
  • tapez Alt-0189 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 189 ?
  • tapez Alt-199 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 199 ?
  • tapez Alt-0199 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 199 ?
  • tapez Alt-215 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 215 ?
  • tapez Alt-0215 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 215 ?
  • tapez Alt-224 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 224 ?
  • tapez Alt-0224 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 224 ?
  • tapez Alt-234 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 234 ?
  • tapez Alt-0234 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 234 ?
  • tapez Alt-247 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 247 ?
  • tapez Alt-0247 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 247 ?
  • tapez Alt-255 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 255 ?
  • tapez Alt-0255 : quel caractère obtenez-vous ? Dans quelle page de code ce caractère porte-t-il le numéro 255 ?

En conclusion, combien de jeux de caractères sont utilisés lorsqu'on saisit un caractère par la méthode alternative, et dans quel intervalle exactement chacun d'entre eux est utilisé ? Dans quel format faut-il saisir le code numérique pour forcer l'utilisation de tel ou tel jeu de caractères ? Notez par écrit et retenez le résultat de votre expérience étonnante mais pas mystérieuse ...

 

Application 8 : conversion unicode dans tous les sens

Les caractères unicode peuvent être représentés par :

  • leur glyphe (le dessin du caractère lui même). Exemple : '€' pour le caractère Euro
  • leur point de code dans la table Unicode. Exemple : U+20AC pour le caractère Euro
  • leur séquence d'octets en UTF-8. Exemple : \xe2\x82\xac pour le caractère Euro

Il existe donc 3 représentations différentes pour décrire un caractère, et donc 6 transformations possibles :

  • convertir un caractère en point de code. Exemple : -> \u20AC
  • convertir un caractère en séquence UTF-8. Exemple : -> \xe2\x82\xac
  • convertir un point de code en caractère. Exemple : \u20AC ->
  • convertir un point de code en séquence UTF-8. Exemple : \u20AC -> \xe2\x82\xac
  • convertir une séquence UTF-8 en caractère . Exemple : \xe2\x82\xac ->
  • convertir une séquence UTF-8 en point de code. Exemple : \xe2\x82\xac -> \u20AC

 

Après les avoir testées dans la console de Python (en mettant en œuvre les informations données dans la partie DÉCOUVERTE), relevez clairement sur papier et retenez les 6 commandes les plus simples permettant d'effectuer chacune de ces 6 transformations en une seule ligne de code.

 

 

Application 9 : recherche de caractères unicode

Le jeu de caractères Unicode évolue sans arrêt et possède aujourd'hui plusieurs milliers de caractères.

Le site unicode-table.com permet de consulter tous les caractères unicode et les nouveautés, et d'obtenir le point de code de chacun d'entre eux.

La page Unicode sur le site Gecif.net permet également de consulter les caractères unicode.

En effectuant des recherches sur ces sites trouvez le point de code des caractères suivants et relevez-les :

  • le symbole de l'Euro
  • un pictogramme représentant un visage portant un masque chirurgical
  • un crayon
  • un avion
  • une paire de ciseaux
  • une étoile
  • un cœur
  • une flèche
  • une voiture
  • une fleur
  • un verre
  • un soleil
  • un téléphone
  • les pièces d'un jeu d'échec
  • des cartes à jouer
  • les lettres grecques

Parmi ces caractères, lesquels sont affichables par Python dans la console ?

En fouillant le jeu de caractères unicode (qui contient plus de 100 000 caractères en tout), trouvez quelques nouveaux caractères, symboles, ou pictogrammes étonnants ou originaux et relevez leur nom et leur point de code. Ces nouveaux caractères sont-ils tous affichables dans la console de Python ?

Essayez de trouver des caractères unicode affichables dans la console de Python et dont l'encodage en UTF-8 s'écrit :

  • sur 1 octet (point de code entre 0 à 127)
  • sur 2 octets (point de code entre 128 à 2047)
  • sur 3 octets (point de code entre 2048 à 65535)
  • sur 4 octets (point de code supérieur ou égal à 65536)

Quel est le plus grand point de code dont le caractère est encore affichable dans la console de Python et quel est ce caractère ?

Recherchez une solution afin d'afficher sur l'ordinateur les caractères unicode non affichables dans la console de Pyhton.

 


Retour en haut de la page

python.gecif.net