IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Unicode et espace insécable


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut Unicode et espace insécable
    Bonjour à tous,


    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    affichage=affichage.decode("utf-8")
    provoque une erreur. En fait affichage contient un texte html et je m'aperçois que la cause de cette erreur est càd un espace insécable.

    Est-ce un problème de ma part ou est-ce que Unicode ne gère pas ce caractère?

    Par ailleurs dans le module qui lit l'url, j'ajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.contenu_texte += self.re_multiplespaces.sub(' ',data.replace('\t',' ').replace('\n','').replace('\r','').replace('"','""').replace(chr(160), ' ')
    L'espace insécable est bien remplacé mais les 'à' ne sont plus affichés...

    D'avance merci à qui pouua m'aider.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    L'espace insécable en unicode existe bien (160 ou \xA0), tu peux le vérifier facilement avec une table de caractères (Windows ou Linux).

    L'instruction "affichage.decode("utf-8")" convertit le chaine "affichage" (supposée être écrite avec l'encodage "utf-8"), en chaine encodée en unicode interne.

    Si cela génère une erreur, c'est que "affichage" n'est pas en utf-8.

    Tyrtamos

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Tout d'abord merci de m'avoir répondu.


    affichage contient un texte récupéré sur wikipédia et le code source de l'url indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    ... C'est pourquoi je ne comprends pas ce qui se passe.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    charset=utf-8 indique simplement que le code source de la page est en utf-8 lorsqu'il est transmis au navigateur, ceci afin que le navigateur affiche correctement.

    Après, tout dépend de la façon dont tu as récupéré le texte sous Python: téléchargement direct, enregistrement sur disque, copier-coller, etc... La solution utilisée doit avoir fait une conversion cachée.

    Dis comment tu as récupéré le texte html.

    Tyrtamos

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Voici une partie du script en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    parser = URLLister()
    		parser.feed(handle.read())        
    		parser.close()                    
     
    		self.definition=parser.contenu_texte
     
     
    class URLLister(SGMLParser):
    	""" --- URLLISTER pour wikipédia ---"""
    	def reset(self):                              
    		SGMLParser.reset(self)
    		self.in_p=0 # Si nous sommes à l'intérieur du balise <p>...</p> 
    		self.contenu_texte=''
    		self.re_multiplespaces = re.compile('\s+')  # regular expression used to remove spaces in excess
     
    	def start_p(self, attrs):    
    		if self.in_p==0:
    			print'attrs :', attrs
    			self.in_p=1
     
    	def end_p(self):
    		self.in_p=2
     
    	def handle_data(self, data):
    		if self.in_p==1:	
    			self.contenu_texte += self.re_multiplespaces.sub(' ',data.replace('\t',' ').replace('\n','').replace('\r','').replace('"','""'))
    self.contenu_texte et self.definition sont-ils en utf-8?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data.replace('\t',' ').replace('\n','').replace('\r','').replace('"','""')
    remplace chaque caractère de tabulation ’\t’ par un blanc ’ ’,
    fait disparaître tous les caractères ’\n’ et ’\r’ (ça va donner un drôle de résultat !! )
    et remplace chaque caractère ’“’ par deux: ’”“’ (je ne vois pas dans quel but)

    data se retrouve donc composée uniquement de caractères différents de ’\t’ ’\r’ et ’\n’ + des blancs

    Lancée là dessus, re_multiplespaces.sub() trouve tous les ’\f’ et les ’\v’ (peu) et les blancs (beaucoup), et les remplace... par des blancs !

    Tarabiscoté.
    N e faut-il pas commencer par corriger ceci ?




    D’autre part, n’est-il pas dommage de se lancer dans la rédaction d’un code avec un module sgmllib et une classe SGMLParser qi sont dépréciés depuis 2.6 et ont disparu de 3.x ?
    ll doit bien y avoir une raison à cela.



    De plus, je ne vois pas quel intérêt il y a à passer par une instance de classe plutôt que par une fonction pou traiter le document HTML.

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour.

    Citation Envoyé par Chris33 Voir le message
    self.contenu_texte et self.definition sont-ils en utf-8?
    Désolé, mais ton code est en même temps trop compliqué pour moi et trop incomplet pour que je te donne une réponse. Il faut faciliter le travail des gens à qui tu demandes de l'aide: fais un petit code mini qui montre le problème et qu'on peut essayer chez nous par simple copier-coller.

    Par ailleurs, j'abonde dans le sens d'eyquem: le module que tu utilises est obsolète. Et ce genre de module a justement tendance à ne pas bien supporter l'unicode.

    Les problèmes d'encodage sont complexes. Voilà quelques éléments pour te donner un coup de pouce:

    - il faut coder pour laisser Python manipuler des chaines unicode en interne.

    - on convertit les chaines en unicode le plus tôt possible, et en sortie le plus tard possible.

    - les conversions d'un encodage à un autre passent toujours par l'unicode interne.

    - quand on parle d'unicode en Python, on ne parle que d'unicode interne (=UCS2 qui est une version simplifiée d'utf-16). L'utf-8 et l'utf-16 sont identifiés comme type str et non comme type unicode!

    Voilà un petit code qui convertit une chaine d'un encodage à un autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import sys
    def convertir(ch, codin='utf-8', codout=None):
        """convertit l'encodage d'une chaine de caractères"""
        if codout==None:
            codout = sys.stdout.encoding # = l'encodage de la console en cours
        if isinstance(ch,str):
            return ch.decode(codin).encode(codout, "replace")
        elif isinstance(ch,unicode):
            return ch.encode(codout, "replace")
        else:
            return "Erreur: ch doit etre une chaine de caracteres"
        print
    Ici, codin est l'encodage de la chaine si elle n'est pas en unicode (on met l'encodage du code source Python par defaut). Et codout est l'encodage cible, mis par défaut à sys.stdout.encoding, qui est l'encodage de la console en cours pour un affichage correct. Si le caractère à convertir n'existe pas dans l'encodage cible, il est remplacé par '?' pour éviter une erreur.

    Voilà quelques exemples d'application de la fonction convertir():

    texte = "abcéèçƩ" # =texte en utf-8
    print convertir(texte) # puisque utf-8 est ici le mode par defaut de convertir()
    print [ord(c) for c in texte]
    print

    texte = u"abcéèçƩ" # =texte en unicode
    print convertir(texte) # puisque l'unicode est detecte directement par convertir
    print [ord(c) for c in texte]
    print

    texte = u"abcéèçƩ".encode("iso-8859-1", "replace") # =texte en iso-8859-1
    print convertir(texte, 'iso-8859-1')
    print [ord(c) for c in texte]
    print

    texte = u"abcéèçƩ".encode("cp1252", "replace") # =texte en cp1252 (Windows)
    print convertir(texte, 'cp1252')
    print [ord(c) for c in texte]
    print

    texte = u"abcéèçƩ".encode("cp850", "replace") # =texte en cp850 (console DOS de Windows)
    print convertir(texte, 'cp850')
    print [ord(c) for c in texte]
    print

    Ce qui affiche:

    abcéèçƩ
    [97, 98, 99, 195, 169, 195, 168, 195, 167, 198, 169]

    abcéèçƩ
    [97, 98, 99, 233, 232, 231, 425]

    abcéèç?
    [97, 98, 99, 233, 232, 231, 63]

    abcéèç?
    [97, 98, 99, 233, 232, 231, 63]

    abcéèç?
    [97, 98, 99, 130, 138, 135, 63]

    Le code #425 est un sigma ('Ʃ') qui n'existe qu'en unicode (unicode interne, utf-8, utf-16, ...). On voit qu'il est codé différemment selon les encodages:
    - 198, 169 en utf-8
    - 425 en unicode
    - 63 = '?' dans les encodages en un octet puisque ce caractère n'existe pas dans ces encodages

    Tyrtamos

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Désolé, je reconnais ne pas vous avoir facilité la tâche. Je viens donc de revoir mon code. Voici un module complet. Il est je pense explicite et fonctionne parfaitement aussi n'hésitez pas à le tester. J'en suis encore à Python 2.4 et j'utilise Scite...
    Ce n'est pas dans ce module que j'ai le problème soulevé plus haut mais je comprends que c'est là que je dois intervenir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #!/usr/bin/python
    # -*- coding:Latin-1 -*-
     
    # Ce module recherche un mot anglais sur wikipédia, puis sa traduction en français et enfin la définition correspondante toujours en français.
     
    import urllib, urllib2
    from sgmllib import SGMLParser
    import re
     
    urlopen = urllib2.urlopen
    Request = urllib2.Request
     
    mon_url = 'http://en.wikipedia.org/wiki/w/index.php'
     
    class Wikipedia(object):
    	def __init__(self):
    		self.traduction=''
    		self.definition=''
     
    	def rechercher(self,a_rechercher='computer'):
    		"""  - traduction représente la traduction du mot anglais(a_rechercher) et mémorise celle-ci
                            dans self.traduction.
                         - appelle la méthode french_traduction()."""
    		values = {'search':a_rechercher}
    		txdata = urllib.urlencode(values)
    		txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}	
    		try:
    			req = Request(mon_url, txdata, txheaders) ### création d'un objet request
    			handle = urlopen(req) ### on l'ouvre pour renvoyer un handle sur l'url
    		except IOError, e:
    		    print '--- ERREUR'
    		else:
    		        self.traduction=self.french_traduction(handle)
     
     
    	def french_traduction(self,handle):
    		"""  - Appelée par rechercher().
                         - Cette méthode cherche le mot français sur la page en anglais.  Ce mot se trouve toujours
                         sur la ligne qui contient le lien vers la page en français,
                         exemple :<li class="interwiki-fr"><a href="http://fr.wikipedia.org/wiki/Maison">Français</a></li>
                         - Le mot français est ensuite retourné à la méthode appelante.
                         - S'il n'existe pas de traduction dans wikipédia alors None est retounée d'office.
                    """
    		for ligne in handle.readlines():
    			### Cherche la ligne, puis en extrait le mot français.
    			if '<li class="interwiki-fr">' in ligne:
    				traduction=ligne
    				traduction= ligne[67:]
    				traduction=traduction[:-21]
    				return traduction
     
    	def definition_du_mot(self,a_rechercher):
    		"""  Cette méthode extrait de la page web affichée la défintion du mot concerné
                         et la mémorise dans self.definition. """
    		# url française :
    		mon_url = 'http://fr.wikipedia.org/wiki/w/index.php'
     
    		values = {'search':a_rechercher}
    		txdata = urllib.urlencode(values)
    		txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}	
     
    		req = Request(mon_url, txdata, txheaders) ### création d'un objet request
    		handle = urlopen(req) ### on l'ouvre pour renvoyer un handle sur l'url
    		parser = URLLister()
    		parser.feed(handle.read())        
    		parser.close()                    
     
    		self.definition=parser.contenu_texte
     
     
    class URLLister(SGMLParser):
    	""" --- URLLISTER pour wikipédia ---"""
    	def reset(self):                              
    		SGMLParser.reset(self)
    		self.in_p=0 # Si nous sommes à l'intérieur du balise <p>...</p> 
    		self.contenu_texte=''
    		self.re_multiplespaces = re.compile('\s+')  # regular expression used to remove spaces in excess
     
    	def start_p(self, attrs):    
    		if self.in_p==0:
    			print'attrs :', attrs
    			self.in_p=1
     
    	def end_p(self):
    		self.in_p=2
     
    	def handle_data(self, data):
    		if self.in_p==1:	
    			data=data.replace(chr(160),'W')
    			self.contenu_texte += self.re_multiplespaces.sub(' ',data.replace('\t',' ').replace('\n','').replace('\r','').replace('"','""'))
     
     
    if __name__=='__main__':
    	test=Wikipedia()
    	test.rechercher()
    	test.definition_du_mot(test.traduction)
    	print'--- traduction :', test.traduction
    	print'--- definition :', test.definition
    Pour l'instant je vais étudier vos explications et je vous en remercie tous deux.

  9. #9
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Résultat des courses avec ton nouveau code:

    ajoute l'importation de sys au début:

    remplace tes 2 dernières lignes par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print'--- traduction :', test.traduction.decode('utf-8').encode(sys.stdout.encoding)
    print'--- definition :', test.definition.decode('utf-8').encode(sys.stdout.encoding)
    Et l'affichage sur la console est ok:


    attrs : []
    --- traduction : Ordinateur
    --- definition : Un ordinateur est une machine dotée d'une unité de traitement lui permettant d'exécuter des programmes enregistrés. C'est un ensemble de circuits électroniques permettant de manipuler des données sous forme binaire, ou bits. Cette machine permet de traiter automatiquement les données, ou informations, selon des séquences d'instructions prédéfinies appelées aussi programmes.


    Donc: le texte récupéré est bien en utf-8!

    Tyrtamos

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Merci pour ces précisions.

    Par contre sys.stdout.encoding semble ne pas fonctionner dans Scite alors qu'il fonctionne dans IDLE.

    aussi mes 2 dernières lignesj'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print'--- traduction :', test.traduction.decode('utf-8').encode( locale.getdefaultlocale()[1])
    	print'--- definition :', test.definition.decode('utf-8').encode( locale.getdefaultlocale()[1])
    et De même dans l'exemple je suis obligé de modifié



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/env python
    # -*- coding:Latin-1 -*-
    import locale
    
    def convertir(ch, codin='utf-8', codout=None):
        """convertit l'encodage d'une chaine de caractères"""
        if codout==None:
            codout = locale.getdefaultlocale()[1] # = l'encodage de la console en cours
    	print'--- codout:',codout
        if isinstance(ch,str):
            return ch.decode(codin).encode(codout, "replace")
        elif isinstance(ch,unicode):
            return ch.encode(codout, "replace")
        else:
            return "Erreur: ch doit etre une chaine de caracteres"
        print
    et cala fonctionne pour tous tes exemples sauf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    texte = "abcéèç?" # =texte en utf-8
    print convertir(texte) # puisque utf-8 est ici le mode par defaut de convertir()
    print [ord(c) for c in texte]
    print
    Je suis obligé de m'absenter mais à plus tard j'espère et encore Merci.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Bonjour,

    Quand j'examine le code que tu m'as donné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    import sys
    def convertir(ch, codin='utf-8', codout=None):
        """convertit l'encodage d'une chaine de caractères"""
        if codout==None:
            codout = sys.stdout.encoding # = l'encodage de la console en cours
        if isinstance(ch,str):
            return ch.decode(codin).encode(codout, "replace")
        elif isinstance(ch,unicode):
            return ch.encode(codout, "replace")
        else:
            return "Erreur: ch doit etre une chaine de caracteres"
        print
     
     
    print"sys.getdefaultencoding() : ", sys.getdefaultencoding()
    print"sys.stdout.encoding() : ", sys.stdout.encoding
    J'obtiens:
    sys.getdefaultencoding() : ascii
    sys.stdout.encoding() : None

    et bien sûr None est le début de mon problème. Connais-tu la raison à celà?

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    sys.getdefaultencoding() donne le codec utilisé par défaut dans les conversions unicode lorsqu'on ne le précise pas. C'est effectivement ascii. C'est une cause courante de plantage puisqu'ascii ne supporte pas les caractères accentués.

    sys.stdout.encoding (sans parenthèse) donne l'encodage de la console d'affichage. Mais certains éditeurs renvoient None. Cela m'est arrivé sur "EasyEclipse pour Python". Il faut, bien entendu connaitre cet encodage, et l'initialiser comme suit (exemple d'une console 'utf-8'):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    codout = sys.stdout.encoding
    if codout == None:
        codout = 'utf-8'
    Si tu ne connais pas l'encodage de la console d'affichage de ton outil de développement, il faut plonger dans sa notice: c'est indispensable de la connaitre.

    Tyrtamos

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    J'utilise Scite, et j'ai vu dans les cours et tutoriels Python qu'il valait mieux préciser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/env python
    # -*- coding: cp1252 -*-
    auparavant, j'utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: latin1 -*-

  14. #14
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Suite à ton dernier message, quelques infos complémentaires:

    1- pour qu'un code source Python soit exécuté avec un encodage donné, il ne faut pas seulement préciser la ligne coding (qui renseignera l'interpréteur Python lors de l'exécution), mais aussi enregistrer ce code source avec le même encodage. Et ça ne représente pour Python que la clé pour encoder les chaines de caractères écrites en dur dans le code source, mais ça ne définit pas l'encodage de la console.

    2- l'encodage 'cp1252' est l'encodage par défaut de Windows, et Windows est le seul à l'utiliser. Tu peux l'utiliser tant que tu restes sous Windows, mais ce n'est pas une obligation (moi, j'utilise 'utf-8'). Cela suppose que ton éditeur peut enregistrer avec cet encodage (à vérifier). A noter que l'encodage de la console DOS de Windows (cmd.exe) est 'cp850', qui code différemment les caractères accentués.

    L'encodage 'latin-1' est un autre nom pour 'iso-8859-1' qui est plus général que 'cp1252'. 'iso-8859-15' permet en plus le caractère de l'euro '€'.

    Trouver un outil de développement qui te permet de préciser les encodages de l'édition, de la console d'affichage et de l'enregistrement n'est pas ce qu'il y a de plus simple. J'ai essayé scite, mais je me perds dans les fichiers de configuration. Le seul que j'ai trouvé et qui me convient est "Eclipse+Pydev".

    Tyrtamos

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Suite à ton message, et pour mieux comprendre, je viens d'installer Eclipse. Mais à nouveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print"--- sys.stdout.encoding :",sys.stdout.encoding
    me renvoie None. Toujours et encore...

    Je suis ensuite allé dans Edit-->Set Encoding...et là j'ai bien une fenêtre avec 2 options: la case cochée est Other avec menu déroulant sur UTF-8...

  16. #16
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne savais pas que tu allais installer Eclipse, sinon, je t'aurais suggéré mon petit tuto: http://python.jpvweb.com/mesrecettes.../eclipse_pydev.

    Installé comme ça, sys.stdout.encoding donne bien l'utf-8 que j'ai mis dans la config.

    Dans la configuration d'Eclipse, le réglage de l'encodage (et de la fin de ligne) se fait dans le menu:
    Windows -> Préférences -> Général -> Workspace.

    Avec une version précédente d'Eclipse, cette configuration ne suffisait pas pour l'encodage de la console, et le sys.stdout.encoding renvoyait None. Il suffisait alors d'ajouter dans eclipse.ini la ligne:

    -Dfile.encoding=UTF-8
    Et là, la console était bien en utf-8, et le sys.stdout.encoding renvoyait bien utf-8 comme prévu.

    Tu peux, bien entendu, choisir un autre encodage que utf-8, y compris cp1252 si tu restes dans Windows.

    Tyrtamos

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Bonjour,

    Je suis effectivement allé visité ton site mais tard. Par contre il est formidable et je ne manquerai pas d'y retourner.

    En ce qui concerne Eclipse, je viens d'effectuer les derniers réglages. Voici la copie de mon fichier eclipse.ini avec le rajout mais cela ne change toujours rien et cela même après avoir relancé Eclipse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -startup
    plugins/org.eclipse.equinox.launcher_1.0.200.v20090520.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
    -product
    org.eclipse.epp.package.jee.product
    --launcher.XXMaxPermSize
    256M
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Xms40m
    -Xmx512m
    -Dfile.encoding=UTF-8

  18. #18
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Comme je ne sais pas quel Eclipse+Pydev tu as installé, je ne peux que te suggérer d'utiliser celui dont je donne l'adresse dans le tuto. Chez moi, ça marche.

    Tyrtamos

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 293
    Par défaut
    Bonjour,

    Je viens d'installer Python 3.1 et là mon problème et en partie résolu mais toujours aussi incompréhensible. En fait, le même script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #! /usr/bin/python
    # -*- coding:utf-8 -*-
     
    import sys
    print("--- sys.stdout.encoding : ", sys.stdout.encoding)
    donne un résultat différent en fonction de son emplacement,
    avec chemin d'accès:
    C:\Python31\encodage.py
    j'obtiens:
    ('--- sys.stdout.encoding : ', None)

    avec chemin d'accès:
    C:\Python31\Mes scripts en Python3\encodage.py
    j'obtiens:
    --- sys.stdout.encoding : cp1252

  20. #20
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En fait, ce n'est pas un gros problème. Quand sys.stdout.encoding renvoie None, il suffit de savoir ce qu'il faut mettre à la place, c'est à dire le vrai encodage de la console d'affichage.

    Tyrtamos

Discussions similaires

  1. [TinyMCE] tinymce espace insécable/no-break space
    Par rasdri dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 06/02/2008, 15h12
  2. [HTML] Espace insécable sous Firefox
    Par Pierre1111 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/02/2008, 10h43
  3. Ecrire une espace insécable
    Par v4np13 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 11/01/2008, 22h09
  4. [Entities] Comment insérer un espace insécable
    Par <nbweb> dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 05/04/2007, 09h26
  5. Espace insécable dans une chaine de caractères
    Par Mors_Ubyte dans le forum Access
    Réponses: 1
    Dernier message: 11/02/2006, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo