string.maketrans Python работает дома, но сбои на Google App Engine

Используя фабрики или методы фабрики для всего создания объекта, можно избежать недопустимых объектов, не выдавая исключения от конструкторов. Метод создания должен возвратить нужный объект, если это в состоянии создать один, или пустой указатель, если это не. Вы теряете определенную гибкость в обработке ошибок конструкции в пользователе класса, потому что возврат пустого указателя не говорит Вам, что пошло не так, как надо в создании объекта. Но это также старается не добавлять сложность нескольких обработчиков исключений каждый раз, когда Вы запрашиваете объект и риск ловли исключений, которые Вы не должны обрабатывать.

5
задан joeforker 3 December 2009 в 21:38
поделиться

2 ответа

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

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

См. Также Как получить str.translate для работать со строками Unicode?

15
ответ дан 18 December 2019 в 10:45
поделиться

Возможно, вы могли бы использовать кодировку 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.

1
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: