2009-06-30 6 views
4

Existe-t-il un moyen d'ajouter un alias à python pour l'encodage? Il y a des sites sur le Web qui utilisent l'encodage « Windows 1251 », mais ont leur charset mis à gagner-1251, donc je voudrais avoir gagnant-1251 être un alias pour windows-1251Ajout d'un alias de codage à python

Répondre

8

Le module encodings est pas bien documenté, donc je voudrais plutôt utiliser codecs, qui is:

import codecs 

def encalias(oldname, newname): 
    old = codecs.lookup(oldname) 
    new = codecs.CodecInfo(old.encode, old.decode, 
         streamreader=old.streamreader, 
         streamwriter=old.streamwriter, 
         incrementalencoder=old.incrementalencoder, 
         incrementaldecoder=old.incrementaldecoder, 
         name=newname) 
    def searcher(aname): 
    if aname == newname: 
     return new 
    else: 
     return None 
    codecs.register(searcher) 

Ceci est Python 2.6 - l'interface est différente dans les versions antérieures. Si vous ne comptez pas vous fier aux composants internes non documentés d'une version spécifique, l'approche de l'aliasing de @ Lennart est bien sur, bien sûr - et en fait plus simple que cela ;-). Mais je soupçonne (comme il le semble) que celui-ci est plus maintenable.

+0

Excellent point Alex! --- Ne pas utiliser un module qui n'a pas une grande documentation. –

5
>>> import encodings 
>>> encodings.aliases.aliases['win_1251'] = 'cp1251' 
>>> print '\xcc\xce\xd1K\xc2\xc0'.decode('win-1251') 
MOCKBA 

Bien que Personnellement, je considérerais ce patch-singe, et utiliser ma propre table de conversion. Mais je ne peux pas donner de bons arguments pour cette position. :)

+0

Alex a fourni un bon argument pour cette position au-dessus. :-) Je pense que la façon officielle est trop de travail, et fournirais tout simplement ma propre liste de conversion, mais ce n'est pas toujours possible –

+1

Peut-être souligner que les clés 'encodings.aliases.aliases' sont normalisées. C'est ainsi que ''win-1251'' dans l'argument' decode() ', avec un tiret, est mappé à'' win_1251'' avec un trait de soulignement en interne. L'inverse ne fonctionne pas; un nom de codage lisible par un humain avec un tiret doit être représenté par un trait de soulignement dans la clé d'alias. – tripleee

0

Les alias de codage peuvent être ajoutés en modifiant le fichier aliases.py.

# euc_jp codec 
'eucjp'    : 'euc_jp', 
'ujis'    : 'euc_jp', 
'u_jis'    : 'euc_jp', 
'euc_jp_linux'  : 'euc_jp', 
'euc-jp-linux'  : 'euc_jp', 

Au-dessus, j'ai ajouté deux alias euc_jp_linux et EUC-jp-linux à l'encodage EUC_JP.

Pour un fichier aliases.py système Linux 64 bits est généralement situé sous /usr/lib64/python2.6/encodings/