3 votes

python... problème d'encodage sous linux > >.

Programme de test simple d'un problème d'encodage :

#!/bin/env python
# -*- coding: utf-8 -*-
print u"Råbjerg"      # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE'

voici ce que j'obtiens lorsque je l'utilise depuis une boîte de commande debian, je ne comprends pas pourquoi l'utilisation de redirect ici a cassé la chose, comme je peux le voir correctement en utilisant sans.

Quelqu'un peut-il m'aider à comprendre ce que j'ai manqué ? et quelle est la bonne façon d'imprimer ces caractères pour qu'ils soient corrects partout ?

$ python testu.py
Råbjerg

$ python testu.py > A
Traceback (most recent call last):
  File "testu.py", line 3, in <module>
    print u"Råbjerg"
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 1: ordinal not in range(128)

utilisant debian Debian GNU/Linux 6.0.7 (squeeze) configuré avec :

$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=

EDIT : à partir d'autres questions similaires vues plus tard à partir du pointage effectué ci-dessous

#!/bin/env python1
# -*- coding: utf-8 -*-
import sys, locale
s = u"Råbjerg"      # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE'
if sys.stdout.encoding is None: # if it is a pipe, seems python2 return None
    s = s.encode(locale.getpreferredencoding())
print s

5voto

Martijn Pieters Points 271458

En redirigeant la sortie, sys.stdout n'est pas connecté à un terminal et Python ne peut pas déterminer l'encodage de sortie. Lorsque no en dirigeant la sortie, Python peut détecter que sys.stdout est un TTY et utilisera le codec configuré pour ce TTY lors de l'impression de l'unicode.

Définissez le PYTHONIOENCODING variable d'environnement pour indiquer à Python quel encodage utiliser dans de tels cas, ou encoder explicitement.

3voto

Ashwini Chaudhary Points 94431

Utilisez : print u"Råbjerg".encode('utf-8')

Une question similaire a été posée aujourd'hui : Comprendre l'Unicode de Python et le terminal Linux

2voto

Paulo Bu Points 13991

Je vous suggère de le sortir déjà encodé :

print u"Råbjerg".encode('utf-8')

Ceci écrira les octets corrects de la chaîne de caractères en utf-8 et vous pourrez les voir dans presque tous les éditeurs/consoles qui supportent le format utf-8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X