All pastes #125408 Raw Edit

Untitled

public text v1 · immutable
·published 2006-08-10 17:04 UTC
rendered paste body
Bonjour,

J'ai écrit une fonction makePrintable() qui permet d'afficher de manière 
intelligible une chaîne de caractère dans un charset donné :
http://hachoir.org/browser/hachoir/trunk/src/hachoir/tools.py?rev=621#L176

Le but étant d'échapper (syntaxe "\xHH") les caractères non imprimables (ou 
invalides dans leur charset d'origine). En particulier lorsqu'on reçoit une 
chaîne 'str', tous les caractères > 127 sont "invalides".

La code donné en lien fonctionne très bien.

Par contre, j'ai remarqué que Python ne valide pas les chaînes Unicode. Si on 
se réfère à la table Unicode : 0xFFFF est invalide, pourtant Python l'accepte 
sans broncher :
>>> u"\uffff"
'\uffff'

Je cherche donc à écrire une fonction (rapide si possible) qui échapperait ces 
drôles de caractères. Proposition qui semble fonctionner (dumoins pour 
l'exemple donné, u"\uffff") :

import unicodedata
def escapeInvalidUnicode(text):
    newdata = []
    for character in text:
        try:
            unicodedata.name(character)
            newdata.append(character)
        except ValueError:
            newdata.append("\u%04x" % ord(character))
    return "".join(newdata)

>>> escapeInvalidUnicode(u"\uffff")
'\\uffff'

Par contre, cette fonction doit être _très_ lente et assez lourde (elle charge 
les noms des caractères Unicode, la table doit être grosse :-p). Une idée 
plus légère ?

Haypo
-- 
Victor Stinner aka haypo
http://hachoir.org/ <~~ nouvelle url, yahoo!