5

ho questo codice in Google AppEngine (Python SDK):string.maketrans di Python lavora in casa, ma non riesce su Google App Engine

from string import maketrans 

intab = u"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ".encode('latin1') 
outtab = u"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn".encode('latin1') 
logging.info(len(intab)) 
logging.info(len(outtab)) 
trantab = maketrans(intab, outtab) 

Quando eseguo il codice nella console interattiva non ho alcun problema, ma quando provo in GAE ottengo il seguente errore:

sollevare ValueError, "maketrans argomenti devono avere stessa lunghezza" ValueError: maketrans argomenti devono avere stessa lunghezza INFORMAZIONI 2009-12-03 20: 04: 02.904 dev_appserver. py: 3038] "POST/backendsavenew HTTP/1.1" 500 - INFO 2009-12-03 20: 08: 37,649 admi n.py:112] 106 INFO 2009-12-03 20: 08: 37,651 admin.py:113] 53 ERRORE 2009-12-03 20: 08: 37,653 init .py: 388] Gli argomenti di maketrans devono avere stessa lunghezza

Non riesco a capire perché l'intab è raddoppiato nelle dimensioni. Il file python con il codice viene salvato come UTF-8.

Grazie in anticipo per qualsiasi aiuto.

risposta

14

string.maketrans e string.translate non funzionano per le stringhe Unicode. La tua chiamata a string.maketrans convertirà implicitamente l'Unicode che hai dato ad una codifica come utf-8. In utf-8å occupa più spazio di ASCII a. string.maketrans vede len(str(argument)) che è diverso per le tue due stringhe.

C'è un traduttore Unicode, ma per il tuo caso d'uso (convertire Unicode in ASCII perché alcune parti del tuo sistema non possono gestire Unicode) devi usare http://pypi.python.org/pypi/Unidecode. Unidecode è molto intelligente nel convertire i caratteri Unicode in ASCII sensibili, coprendo molti più caratteri rispetto al tuo esempio.

Dovresti salvare il codice Python come utf-8, ma assicurati di aggiungere la magia in modo che Python non debba presumere che hai usato la codifica predefinita del sistema. Questa linea dovrebbe essere la prima o seconda linea dei file Python:

# -*- coding: utf-8 -*- 

Ci sono molti vantaggi per l'elaborazione del testo come Unicode invece di stringhe binarie. Questo è il modo di Unicode per fare ciò che si sta cercando di fare:

intab = u"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ" 
outtab = u"aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" 
trantab = dict((ord(a), b) for a, b in zip(intab, outtab)) 
translated = intab.translate(trantab) 
translated == outtab # True 

Vedi anche Where is Python's "best ASCII for this Unicode" database?

Vedi anche How do I get str.translate to work with Unicode strings?

+0

Preferisco non aggiungere un nuovo pacchetto a GAE per risolverlo, ma esaminerò il codice di Unidecode. Grazie. –

+0

# - * - codifica: utf-8 - * - risolto. Grazie. –

+0

Ho anche bisogno di cancellare alcuni caratteri. Ho cambiato il codice in "modo Unicode" e ho aggiunto alcune conversioni a None nel dizionario. –

1

Forse si potrebbe utilizzare la codifica ISO-8859-1 per il file invece di utf-8

# -*- coding: iso-8859-1 -*- 
from string import maketrans 
import logging 

intab = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ" 
outtab = "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn" 
logging.info(len(intab)) 
logging.info(len(outtab)) 
trantab = maketrans(intab, outtab) 

Ricordarsi di selezionare iso-8859-1 nell'editor di testo durante il salvataggio di questo file di origine Python.

+0

Mi chiedo perché sono stato svalutato. Il codice funziona su google appengine (ho appena testato) e fa quello che dovrebbe. –

+0

Sfortunatamente la domanda è sbagliata.La soluzione giusta è eseguire l'elaborazione del testo in Unicode ed evitare del tutto "str.translate". – joeforker