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!