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

Réseau/Web Python Discussion :

[webpy] problème d'encodage difficile à résoudre


Sujet :

Réseau/Web Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 31
    Points
    31
    Par défaut [Résolu] problème d'encodage difficile à résoudre
    Bonjour à tous,

    je rencontre un problème que je ne parviens pas à résoudre sous webpy:
    Un problème d'encodage avec les accents français lorsque j'utilise db.query().

    Il semble qu'il y ait un problème avec le fichier db.py on line 124 :

    /usr/lib/python2.5/site-packages/web/db.py", line 124, in __init__ self.items = [str(items)]
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-57: ordinal not in range(128)


    J'ai essayé différentes solutions, y compris celle de Max que j'ai trouvé ici :
    http://www.mail-archive.com/webpy@googlegroups.com/msg04618.html

    Je joins à ce post un bout de code qui illustre bien cette erreur.
    J'ai vraiment besoin d'une aide car je suis complêtement bloqué !

    Tout d'abord, voici fichier qui vous aidera à crééer une simple table MySQL 'charsetproblem.mysql':

    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
    # Usage: 	mysql -u mylogin -p mybase < charsetproblem.mysql #
    # 		Open  : mysql -u mylogin -p mybase 			#
    # 			mysql>	   SHOW TABLES;	  			#
    # 			mysql>	   select * from articles;	  	#
    # 			mysql>	   DROP TABLE IF EXISTS articles;	#
    # 												#
     
    # --- create table ---#
     
    CREATE TABLE articles (
    id int(10) NOT NULL auto_increment,
    titre char(80)  DEFAULT "" NOT NULL,
    article text(4096)  DEFAULT "" NOT NULL,
    PRIMARY KEY (id)
    )DEFAULT CHARACTER SET utf8; 
     
    # Note: i tried with and without DEFAULT CHARACTER SET utf8;#
     
     
    # --- insert datas ---#
     
    INSERT INTO articles VALUES (NULL, "simple link without french characters", "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
     
    INSERT INTO articles VALUES (NULL, "simple link with frènch chàracters", "Lorém ipsum dôlor sit amet, çonsèctetur àdipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");

    Ensuite voici un bout de code 'code.py' qui vous permettra de lancer le serveur webpy:


    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
     
    #!/usr/bin/env python
    #-*- coding: iso-8859-1 -*-
     
    # Note: 	See charsetproblem.mysql to install table 'article'.
    #		Change your settings for user, pw and db (web.database lowest).
    #		Create a directory named 'templates" in the same directory as this 
    #		script.
    #
     
     
    import web
    from web import form
     
    web.config.debug = False
     
    db = web.database(dbn='mysql', user='myname', pw='mypassword', db='mydb')
     
    render = web.template.render('templates/')
     
    urls = (
    	'/(.*)', 'index'
    	)
     
    app = web.application(urls, globals())
     
     
    class index:
    	"""
            """	
    	def __init__(self):
    		"""  """
     
    	def GET(self, name = "index"):
    		""" shows the home page """
     
    		# I try with those charsets without success
    		web.header("Content-Type", "text/html; charset= utf-8")
    		#web.header("Content-Type", "text/html; charset= iso-8859-1")
     
    		links = []
    		article =[]
     
     
    		# --- LINKS -
     
    		# All titles become links
    		result_titre_db = db.query('select titre from articles;')
    		for i in result_titre_db:
    			links.append(i.titre)
    			# Curiously, if I try this one, link's charset is correct...
    			#links.append(i.titre.encode('raw_unicode_escape'))
     
     
    		# --- ARTICLES -
     
    		# It is the error which shows the 'self.items' error in db.py,
    		# even if I change charset in web.header above:
    		# File "/usr/lib/python2.5/site-packages/web/db.py", line 124, in __init__
        		# self.items = [str(items)]
    		# UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-57: ordinal not in range(128)
    #		query = 'select article from articles where articles.titre = "%s";' % name
     
    		# Other tests:
    		# No error, but bad charset even if I change charset in web.header above.
    		query = 'select article from articles where articles.titre = "%s";' % name.encode("utf-8")
    #		query = 'select article from articles where articles.titre = "%s";' % name.encode('raw_unicode_escape')
    #		query = 'select article from articles where articles.titre = "%s";' % name.encode('iso-8859-15')		
     
    		result_article_db = db.query(query)
    		for i in result_article_db:
    			article.append(i.article)
    		if article == []:
    			return web.notfound()
     
     
    		return render.index(name, links, article)
     
    if __name__ == "__main__": 
    	app.run()

    Il suffit de placer ce code dans le repertoire web de webpy et le lancer le server :
    Merci à vous pour le coup de main, parce que là, je suis bloqué.

    boubou.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    Je viens de me rendre compte que j'ai oublié de fournir le template :

    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
    $def with (name,links, article)
    $# File: templates/index.html
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
     
    	<html>
    	<head>
    	</head>
     
    	<body>
    		<h3>$name </h3>
     
    			$for i in links:
    				<a href="$i">$i </a><br>
    		<em>
    			$for j in article:
    				$j
    		</em>
     
    	</body>
    	</html>

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    Andrei m'a apporté une idée qui m'a permis de trouver un morceau de solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result_article_db = db.query("select * from articles where articles.titre = $title",vars=dict(title=name))
    Et je n'ai plus qu'à modifier le template en ajoutant .encode('iso-8859-1') aux variables.

    Malheureusement cette solution n'est que partielle, car je ne peux modifier l'encodage dans le href de $i dans cette ligne du template sans générer une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #<a href="$i.encode('iso-8859-1')">$i.encode('iso-8859-1') </a><br> # Ne fonctionne pas
    <a href="$i">$i.encode('iso-8859-1') </a><br> # Fonctionne
    Dans la ligne qui fonctionne (<a href="$i">$i.encode('iso-8859-1') </a><br>), l'url est affichée de cette façon :

    http://127.0.0.1/simple%20link%20wit...3%C2%A0racters


    je n'ai pas modifié le db.py dans /usr/lib/python2.5/site-packages/web/db.py

    ---
    Voici les trois fichiers :

    code.py
    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
    #!/usr/bin/env python
    #-*- coding: iso-8859-1 -*-
     
    import web
    from web import form
     
    web.config.debug = False
     
    db = web.database(dbn='mysql', user='myname', pw='mypassword', db='mydb')
     
    render = web.template.render('templates/')
     
    urls = (
    	'/(.*)', 'index'
    	)
     
    app = web.application(urls, globals())
     
    class index:
    	"""
            """	
    	def __init__(self):
    		"""  """
     
    	def GET(self, name = "index"):
    		""" shows the home page """
     
    		# I try with those charsets without success
    		web.header("Content-Type", "text/html; charset= utf-8")
    		#web.header("Content-Type", "text/html; charset= iso-8859-1")
     
    		links = []
    		article =[]
     
    		# --- LINKS -
     
    		# All titles become links
    		result_titre_db = db.query('select titre from articles;')
    		for i in result_titre_db:
    			links.append(i.titre)
     
    		# --- ARTICLES -
     
    		# Andrei solution
    		result_article_db = db.query("select * from articles where articles.titre = $title",vars=dict(title=name)) 
     
    		#result_article_db = db.query(query) 
    		for i in result_article_db:
    			article.append(i.article)
     
    		return render.index(name, links, article)
     
    if __name__ == "__main__": 
    	app.run()

    charsetproblem.mysql
    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
    # Usage: 	mysql -u mylogin -p mybase < charsetproblem.mysql #
    # 		Open  : mysql -u mylogin -p mybase 			#
    # 			mysql>	   SHOW TABLES;	  			#
    # 			mysql>	   select * from articles;	  	#
    # 			mysql>	   DROP TABLE IF EXISTS articles;	#
    # 												#
    # --- create table ---#
     
    CREATE TABLE articles (
    id int(10) NOT NULL auto_increment,
    titre char(80)  DEFAULT "" NOT NULL,
    article text(4096)  DEFAULT "" NOT NULL,
    PRIMARY KEY (id)
    )DEFAULT CHARACTER SET utf8; 
     
    # Note: i tried with and without DEFAULT CHARACTER SET utf8;#
     
    # --- insert datas ---#
     
    INSERT INTO articles VALUES (NULL, "simple link without french characters", "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
     
    INSERT INTO articles VALUES (NULL, "simple link with frènch chàracters", "Lorém ipsum dôlor sit amet, çonsèctetur àdipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");

    /templates/index.html

    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
    $def with (name,links, article)
    $# File: templates/index.html
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">	
    	<html>
    	<head>
    	</head>
     
    	<body>
    		<h3>$name.encode('iso-8859-1') </h3>
     
    			$for i in links:
    				<a href="$i">$i.encode('iso-8859-1') </a><br>
    		<em>
    			$for j in article:
    				$j.encode('iso-8859-1') 
    		</em>
    	</body>
    	</html>
    Resultats :

    simple link without french characters
    simple link with frènch chàracters
    Lorém ipsum dôlor sit amet, çonsèctetur àdipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    Voici l'url lorsqu'on pointe sur le lien simple link with frènch chàracters :

    http://127.0.0.1/simple%20link%20wit...3%C2%A0racters


    Si quelqu'un a une idée...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 31
    Points
    31
    Par défaut
    Je travaille sous Ubuntu (gnome) avec gedit. Chaque fichier sous gedit est enregistré avec le codage des caractères par défaut 'Locale actuelle (utf-8)'.
    J'ai modifié l'enregistrement du fichier charsetproblem.mysql pour qu'il soit enregistré avec l'encodage des caractères 'Occidental (ISO-8859-15)'.

    Du coup, plus besoin d'encodage dans webpy et templator, il fonctionne parfaitement par défaut, si l'on prend soin de modifier la ligne 124 de db.py de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #self.items = [str(items)] # old
    self.items = [items]
    Problème [résolu].

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 29
    Points : 31
    Points
    31
    Par défaut Rectitifcation
    Une petite rectification :

    Il semblerait que je n'ai pas correctement utilisé l'objet requête durant mes tests.
    En conclusion, le problème ne venait que de l'encodage du fichier charsetproblem.mysql qui doit se faire en iso-8859-15.

    La requête doit se faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result_article_db = db.query("select * from articles where articles.titre = $title",vars=dict(title=name))
    Il est donc inutile de modifier le fichier db.py

    Webpy gère parfaitement l'encodage. En esperant que ça servira à quelqu'un un jour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CSV] Problème d'encodage
    Par simoryl dans le forum Langage
    Réponses: 13
    Dernier message: 18/04/2012, 15h20
  2. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36
  3. Problème d'encodage en Unicode
    Par Skreo dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/12/2005, 10h43
  4. Problème d'encodage sur MySql 4.1
    Par Blanchet dans le forum Outils
    Réponses: 1
    Dernier message: 04/12/2005, 04h53
  5. [XML::PARSER] Problème d'encodage
    Par frangin2003 dans le forum Modules
    Réponses: 13
    Dernier message: 05/09/2005, 14h59

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