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.

Python 3.4 + Curses sous Windows 7 - Erreur d'encodage

0 votes

J'ai installé curses sous Win7 curse sous windows 7.
Cela se passe bien tant qu'il n'y a pas d'accent.
Voici ma config d'encodage (fichier source en utf8 édité avec sublime-text):

print( 'élémentaire!')
print( 'StdOut encoding: %s' % sys.stdout.encoding )
print( 'filesystem encoding: %s' % sys.getfilesystemencoding() )
print( 'preferred encoding (curse): %s' % locale.getpreferredencoding() )

Ma console dos est en cp850 et l'impression des accentués avec print() est impeccable.

élémentaire!
StdOut encoding: cp850
filesystem encoding: mbcs
preferred encoding (curse): cp1252

Par contre, curse utilise locale.getpreferredencoding() pour l'encodage !
Par conséquent, les accents sont encodés en cp1252 pour être affiché dans une console DOS en cp850.

Cela donne ce résultat (voyez le script en fin de billet):

Cr├®ationsuivant pr├®c├®denLister Recherche Modifier Annuler Fourn XR├®fKit BO
Texte Libre Y-etiq Voir Mail-it Inv. + / Quitter

J'ai essayé de fixer PYTHONIOENCODING (la variable d'environnement) sur cp1252 mais l'affichage est tout aussi mauvais.

Quelqu'un aurait-il une suggestion?

Voici le code (beta) utilisé:

# coding: utf8
""" See c:\Python34\Lib\curses\has_key.py  for extra key_strokes """
import curses
from curses.textpad import Textbox, rectangle
import sys
import locale


def show_dspmenuwin(stdscr, menuitems):
    """ Open a screen and display a navigation menu """
    # ScreenSize: (0,0) to (curses.LINES - 1, curses.COLS - 1). 
    menu_height = 2
    menu_width  = curses.COLS

    rawitems = [] # collection of (labels,y,x) items

    win = curses.newwin( menu_height, menu_width, curses.LINES-menu_height,0 ) # Height, width, begin_y, begin_x
    x_pos = 0
    y_pos = 0
    for item in menuitems:
        # Check if new item is still on the screen otherwise Wrap line
        if x_pos + len( item )+1 > menu_width:
            x_pos = 0
            y_pos += 1
        if y_pos >= menu_height:
            raise Exception( 'Too much lines (%s) for menu' % (y_pos+1) )

        # Register menuitem
        rawitem = (item,y_pos, x_pos)
        rawitems.append( rawitem )
        # Increment next item position
        x_pos += len( item )+1 

        # Former display
        win.addstr( rawitem[1], rawitem[2], rawitem[0] ) # y, x, "text"



    #win.addstr( 0,0, "Line1, cols: %s" % curses.COLS ) # y,x
    #win.addstr( 1,0, "line2, lines: %s" % curses.LINES )

    win.refresh()
    win.getch()

def main(stdscr):
    menuitems = ["Création", "suivant", 'précédent', 'Lister', 'Recherche', 'Modifier', 'Annuler',
            'Fourn', 'XRéf', 'Kit', 'BO', 'Texte Libre', 'Y-etiq', 'Voir', 'Mail-it', 'Inv.', '+', '/', 'Quitter']
    show_dspmenuwin(stdscr, menuitems)

curses.wrapper(main)

#print( 'élémentaire!')
#print( 'StdOut encoding: %s' % sys.stdout.encoding )
#print( 'filesystem encoding: %s' % sys.getfilesystemencoding() )
#print( 'preferred encoding (curse): %s' % locale.getpreferredencoding() )
demandé 27-Jul-2016 par domeu (104 points)

en utilisant chcp (utilitaire dos), il est possible de changer le code page du prompt DOS.

chcp 1252

Le scipt m'informe bien que je suis en cp1252 pour stdout et preferredencoding()

élémentaire!
StdOut encoding: cp1252
filesystem encoding: mbcs
preferred encoding (curse): cp1252

Mais bon, l'affichage fait par curse reste largement incorrect.

Créationsuivant précédenLister Recherche Modifier Annuler Fourn XRéfKit BO
Texte Libre Y-etiq Voir Mail-it Inv. + / Quitter

Encore des informations (qui pourraient être utile).

Au détour de différentes lectures (a confirmer), j'ai appris que cette bibliothèque curses utilise PDCurses s'appuie elle-même sur la SDL. La SDL qui, elle, n'intègre le support Unicode que depuis peu (jan 2016).
C'est peut être normal que cela cafouille un peu.

C'est étrange, j'ai testé ta solution sur mon PC windows avec python 3.5, et je n'ai pas de window.encoding .

Yoch: L'information d'encodage apparaît après avoir pressé une touche au clavier, ce qui fait disparaître le pseudo menu. les information d'encodage apparaissent juste avant la fin du script.

J'ai également fais un essai avec Python 3.5... et mes accentués restent déformés dès que Curse prend l'affichage en charge.

Quelques idées:

  • Est-ce que tu peux vérifier que sys.stdin.encoding et sys.stdout.encoding sont bien set en cp1252
  • Peux tu vérifier ce que retourne locale.getdefaultlocale() et essayer de le set comme ceci: locale.setlocale(locale.LC_ALL, 'fr_FR')

Mon stdin encoding est bien cp1252
Mon stdout encoding est bien cp1252
mon locale.getdefaultlocale() est ('fr_BE', 'cp152')

Comme c'est Windows, j'ai pu faire un locale.setlocale() avec les paramètres suivants:
locale.setlocale( locale.LCALL, 'frafra' )
locale.setlocale( locale.LCALL, 'belbel' )

Mon affichage curse est toujours aussi bancale alors qu'un print() python est impeccable. C'est comme si curse ignorait l'encodage de ma console!

1 Réponse

–1 vote

essayes pygcurse à la place.

répondu 27-Jul-2016 par buffalo974 (2,516 points)
...