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?