Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Convertir des "é" en "é" (python 2.7)

+2 votes

J'ai un soucis d'encodage dans une base de données MySql, elle est indiqué comme étant en utf-8 mais à l'intérieur, j'ai des caractères comme "é". Par exemple :
"J\'avais déjà commencé ce cours..."

J'ai remarqué que quand je faisais des "replace" sur mon chaîne de caractère avec :
texte = texte.replace(u'\u00C3\u00A9',u'é')
ou
texte = texte.replace(u'\u00C3\u00A9',u'\uC3A9')

Cela permettait de corriger le problème... Mais il faut mettre autant de replace que de caractère et si j'oublie un caractère, ça ne fonctionne pas (donc je passe mon temps à executer mon code, chercher s'il reste des caractères qui n'ont pas été converti et recommencer)

Mais je voulais savoir s'il y avait une autre façon de faire (avec des encode/decode ?) ou s'il était possible d'automatiser ces replaces (j'ai essayé avec des boucles, des ord, des unichr, mais ça ne fonctionnait pas)

J'ai aussi l'impression qu'il m'a transformé certains caractères qu'il ne fallait pas pour m'afficher des caractères asiatiques. A noter également qu'il s'agit d'un "one-shot" et que je n'ai pas besoin de performance très importante (j'ai peut être 10 000 enregistrements en base grand maxi)

Malgré une lecture assidue de l'excellent article de Sam & Max sur l'encodage, je dois avouer que je commence à désespérer.

demandé 24-Mai-2016 par axel584 (122 points)
edité 24-Mai-2016 par max

Oui, je l'ai lu (c'est ce que j'indiquais dans la dernière phrase de mon message)... J'ai aussi lu le tuto de Sébastien Sauvage... Mais c'est toujours aussi flou... Disons que j'ai surtout compris "comment NE PAS avoir le problème" (mais pas comment le résoudre)

2 Réponses

+3 votes

Est-ce que tu as testé de passer tes chaines dans iconv ?

Dans un terminal où tout est en utf-8, j'ai :

echo "déjà commencé" | iconv -f iso-8859-15 -t utf-8
déjà commencé

Donc ça ressemble bien à de l'iso-8859-15. Peut-être que ceci pourrait marcher :

  • récupération des chaines dans la bdd
  • echo $machaine | iconv -f iso-8859-15 -t utf-8 | writebackto_bdd

A essayer (sur un dump de la bdd évidement).

répondu 24-Mai-2016 par ivoire (198 points)
+2 votes

Tu pourrais utiliser les commandes ALTER DATABASE et ALTER TABLE:

ALTER DATABASE ta_db CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE ta_db CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ou alors essayer d'utiliser iconv comme le suggère ivoire:

mysqldump --add-drop-table ta_db | replace CHARSET=le_charset_qui_foire CHARSET=utf8 | iconv -f le_charset_qui_foire -t utf8 | mysql ta_db
répondu 24-Mai-2016 par c0da (2,744 points)
...