Python Facile

Source : PrintIso.py

 
#!/usr/bin/env python
# -*- coding: cp1252 -*-
"""
Nom: print.py
Description:
Classe permettant d'écrire les accents dans une fenètre 'DOS' sous Windows.

Auteur: Lionel Grolleau <lionel.grolleau (at) free.fr>
Date: 01/10/02
Version: 0.1.4
License: GPL
Test: Python 2.3.2 sous Windows 98

Restriction:
Cette classe ne fonctionne qu'avec le jeu de caractères CP1252 (ISO-8859-1 
à la mode Windows), donc le symbole '€' (euro) s'affiche sous cette forme 'Ç'.

Utilisation:
C'est trés simple, il suffit d'instancier la classe, puis d'utiliser normalement
la fonction interne 'print'. Voir un exemple avec la procédure 'test'.
"""

import sys, os.path, locale

# ne fonctionne que sur les machines sous Windows
PLATFORM = 'win32'
# n'est pas utile si le script est lancé par pythonw (lancement de python sans terminal windows)
PYTHONEXE = 'PYTHONW.EXE'
# Recupere l'encodage par défaut
def_loc = locale.getdefaultlocale()[1]
if def_loc:
    DEF_ENCODING = def_loc
else:
    DEF_ENCODING = 'ascii'
# l'encodage par défault d'une fenêtre DOS est CP850
OUT_ENCODING = 'cp850'

class PrintIso:
    def __init__(self, decode = DEF_ENCODING, encode = OUT_ENCODING, euro = 'E'):
        """ Test et Démarre l'encodage en modifiant la sortie standard.
        
        decode : codage des chaines, identique au codage du fichier (voir
        ligne 2 du module) et/ou à l'encodage par défaut, 'cp1252' pour Win98.
        encode : codage du terminal, 'cp850' pour les fenêtres DOS sous Win98.
        euro : chaine affichée à la place de l'euro dans la fenêtre DOS."""
        self.DECODE = decode
        self.ENCODE = encode
        self.MODE = 'strict'
        self.EURO = euro
        if sys.platform != PLATFORM:
            self.DECODE = None
            return
        if os.path.basename(sys.executable).upper() == PYTHONEXE:
            self.ENCODE = 'cp1252'
            self.MODE = 'replace'
        sys.stdout = self
    def __del__(self):
        """ Restore l'état initial de la sortie standard à la destruction de l'instance."""
        sys.stdout = sys.__stdout__
    def write(self, data):
        """ Encode les datas."""
        codingData = ''
        caractere = ''
        for x in data:
            if caractere:
                caractere += x
            else:
                caractere = x
            try:
                codingData += unicode(caractere, self.DECODE).encode(self.ENCODE, self.MODE)
                caractere = ''
            except UnicodeEncodeError: # bug affichage caractere u'€' dans la fenetre DOS
                codingData += self.EURO
                caractere = ''
            except UnicodeDecodeError:
                pass
            except TypeError:
                try:
                    codingData += caractere.encode(self.ENCODE, self.MODE)
                    caractere = ''
                except UnicodeEncodeError: # bug affichage caractere u'€' dans la fenetre DOS.
                    try:
                        caractere.encode('cp1252', self.MODE)
                        codingData += self.EURO
                    except UnicodeEncodeError: # Caractères unicode inconnu !
                        codingData += '?'
                    caractere = ''
        else:
            sys.__stdout__.write(codingData)
    def open(self):
        """ Démarre ou redémarre l'encodage."""
        if self.DECODE:
            sys.stdout = self
    def close(self):
        """ Arrete l'encodage et restore l'état initial de la sortie standard."""
        sys.stdout = sys.__stdout__

def test():
    p = PrintIso()
    print "Test : éè¤."
    print "Euro : €."
    print u'chaine unicode : \u20acé褀.'
    print u'code inconnu: \u40ff.'
    p.close()

if __name__ == '__main__':
    test()