2009-06-30 3 views
4

Gibt es eine Möglichkeit, dass ich Alias ​​zu Python für die Codierung hinzufügen kann. Es gibt Seiten im Internet, die die Kodierung ‚Windows-1251‘ verwenden, aber haben ihre charset zu gewinnen-1251 gesetzt, so möchte ich win-1251 haben ein Alias ​​für Windows-1251 seinHinzufügen von Encoding-Alias ​​zu Python

Antwort

8

Das encodings Modul nicht gut so dokumentiert ich stattdessen codecs, die is verwenden würde:

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) 

Dies ist Python 2.6 - die Schnittstelle ist in früheren Versionen unterschiedlich.

Wenn es Ihnen nichts ausmacht, sich auf die nicht dokumentierten Interna einer bestimmten Version zu verlassen, ist @ Lennarts Aliasing-Ansatz natürlich auch in Ordnung - und in der Tat einfacher als das ;-). Aber ich vermute (wie er scheint), dass dieser aufrechterhaltbar ist.

+0

Toller Punkt Alex! --- Verwenden Sie kein Modul, das keine großartige Dokumentation hat. –

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

Obwohl Ich würde dieses Monkey-Patching persönlich betrachten und meine eigene Konvertierungstabelle verwenden. Aber ich kann keine guten Argumente für diese Position geben. :)

+0

Alex über ein gutes Argument für diese Position zu bieten hat. :-) Ich denke, der offizielle Weg ist zu viel Arbeit, und würde immer noch einfach meine eigene Konvertierungsliste zur Verfügung stellen, aber das ist nicht immer machbar –

+1

Vielleicht weisen Sie darauf hin, dass die 'encodings.aliases.aliases' Schlüssel normalisiert sind. Dies ist, wie ''win-1251'' im' decode() 'Argument, mit einem Bindestrich, auf' 'win_1251'' mit einem Unterstrich intern abbildet. Andersherum funktioniert nicht; Ein für Menschen lesbarer Kodierungsname mit einem Bindestrich muss mit einem Unterstrich im Alias-Schlüssel dargestellt werden. – tripleee

0

Codierung Aliasnamen können durch Bearbeiten der Datei aliases.py hinzugefügt werden.

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

Above ich zwei Aliase hinzugefügt haben euc_jp_linux und euc-jp-linux auf die Codierung EUC_JP.

Für einen 64-Bit-Linux-System aliases.py Datei ist in der Regel befindet sich unter /usr/lib64/python2.6/encodings/