String.maketrans Python работает дома, но не работает в Google App Engine - PullRequest
5 голосов
/ 03 декабря 2009

У меня есть этот код в Google AppEngine (Python SDK):

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)

Когда я запускаю код в интерактивной консоли, у меня нет проблем, но когда я пробую его в GAE, я получаю следующую ошибку:

повысить ValueError, "аргументы maketrans должны иметь одинаковую длину" ValueError: аргументы maketrans должны иметь одинаковую длину INFO 2009-12-03 20: 04: 02,904 dev_appserver.py:3038] «POST / backendsavenew HTTP / 1.1» 500 - ИНФОРМАЦИЯ 2009-12-03 20: 08: 37,649 admin.py:112] 106 ИНФОРМАЦИЯ 2009-12-03 20: 08: 37,651 admin.py:113] 53 ОШИБКА 2009-12-03 20: 08: 37,653 init .py: 388] аргументы maketrans должны иметь одинаковую длину

Я не могу понять, почему размер вкладки удвоился. Файл python с кодом сохраняется как UTF-8.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

15 голосов
/ 04 декабря 2009

string.maketrans и string.translate не работают для строк Unicode. Ваш звонок на string.maketrans косвенно преобразует Unicode, который вы ему дали, в кодировку, подобную utf-8. В utf-8 å занимает больше места, чем ASCII a. string.maketrans видит len(str(argument)), который отличается для ваших двух строк.

Существует перевод Unicode, но для вашего случая использования (конвертируйте Unicode в ASCII, потому что какая-то часть вашей системы не может работать с Unicode) вы должны использовать http://pypi.python.org/pypi/Unidecode. Unidecode очень умел транслитерировать символы Unicode в разумные ASCII , охватывающий гораздо больше символов, чем в вашем примере.

Вы должны сохранить свой код Python как utf-8, но убедитесь, что вы добавили магию, чтобы Python не предполагал, что вы использовали кодировку системы по умолчанию. Эта строка должна быть первой или второй строкой ваших файлов Python:

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

Существует много преимуществ обработки текста как Unicode вместо двоичных строк. Это Unicode способ сделать то, что вы пытаетесь сделать:

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

См. Также Где находится база данных Python "лучший ASCII для этого Unicode"?

См. Также Как заставить str.translate работать со строками Unicode?

1 голос
/ 04 декабря 2009

Возможно, вы могли бы использовать для своего файла кодировку iso-8859-1 вместо 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)

Не забудьте выбрать iso-8859-1 в текстовом редакторе при сохранении этого исходного файла python.

...