Thursday, December 27, 2012

UTF-8, les accents et Python

Python 2

Avec Python 2.x (2.7.x sur Raspberry Pi), on peux utiliser les caractères accentués directement dans nos chaines de caractères. Par exemple:

machaine = u"je suis bien étonné, François!"



Le u devant la chaine indique que c'est en unicode.

Encodage

En plus de cela, il faut indiquer a l’éditeur l'encodage (car on n'utilise pas des valeurs hexa ou octales, mais bien les caractères eux-mêmes). On peut utiliser un encodage latin-1, ISO-8859 ou un autre qui semble émerger comme le plus courant: UTF-8.

Pour declarer cela dans notre fichier Python, il faudra commencer avec:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

ou
#!/usr/bin/env python
# vim: set fileencoding=utf-8

selon que l'on prefere la syntaxe emacs ou vim :)

Python 3

Avec Python 3.x, les chaines sont toutes Unicode, et donc plus besoin de mettre un u devant les chaines. Toutefois, il faut encore et toujours declarer notre encodage, comme ci dessus.


Brython

Et avec Python pour les navigateurs web (Brython)? Brython suis la syntaxe de Python 3, et donc on peut declarer une chaine Unicode, sans u:

CYR =  'АБЦДЕФГЧИЙКЛМНОПЯРСТУВЖХЫЗШЩЭЮЁЬЪ'
Dans ce cas ci, l'alphabet russe. Mais pas dans l'ordre naturel. Je l'ai mis ici dans l'ordre de l'alphabet latin, de façon phonétique.

Et l'encodage lui? On le fera a l'exterieur du script Python. On l'indique par l'entremise de HTML et meta:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Un éditeur HTML (genre Bluefish) va savoir quel encodage utiliser, et idem pour le navigateur web qui recevra cela.

Si vous etes curieux, voila le lien (ruskey.html) et le code de mon petit test de clavier phonétique pour le cyrillique (russe):


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="/brython.js"></script>
</head>
<body onload="brython()">
<h1>Phonetic cyrillic on QWERTY keyboard</h1>
Here is a little test, mapping latin characters on a keyboard to their phonetically equivalent characters in a cyrillic script, as used in Russian.
<p>
This demoes UTF-8 unicode, handling of keyboard events, and adding, modifying and deleting elements from the tree.
<script type="text/python">

"""
Phonetic ordering of cyrillic (фонетических упорядочение кириллицу)
We are matching the latin alphabet, uppercase, then lowercase
"""

CYR =  'АБЦДЕФГЧИЙКЛМНОПЯРСТУВЖХЫЗШЩЭЮЁЬЪабцдефгчийклмнопярстувжхызшщэюёьъ'
position = 0


def printkey(letter):
    global position
    try:
        span = doc[str(position)]
        span.value = letter
    except KeyError:
        doc <= SPAN(letter, id = str(position))
    position += 1


def deletekey():
    global position
    position -= 1
    if position < 0:
        position = 0
    else:
        del doc[str(position)]


def keydown(e):
    if not e:
        e = win.event
    key = e.keyCode
    offset = 65 if e.shiftKey else 32
    e.preventDefault()
    e.stopPropagation()
    log(key)
    if key == 8:
        deletekey()
    elif key == 32:
        printkey(' ')
    elif key in range(48, 58):
        printkey(str(key - 48))
    elif key >= offset:
        printkey(CYR[key - offset])


def keyup(e):
    if not e:
        e = win.event
    e.preventDefault()
    e.stopPropagation()


def drawkeyboard():
    table = TABLE()
    row = TR()
    for letter in CYR:
        row <= TD(BUTTON(letter, onClick= "printkey('%s')" % letter))
        if letter in ('Я','Ъ','я'):
            table <= row
            row=TR()
    table <= row
    doc <= table


# Draw keyboard and set key events

drawkeyboard()
doc.onkeydown = keydown
doc.onkeyup = keyup

</script>
<br />
Click buttons or type on keyboard:
<br />
</body>
</html>

No comments: