La función maketrans () de Python 2 no funciona con Unicode: “los argumentos tienen diferentes longitudes” cuando en realidad son

[Python 2] SUB = string.maketrans (“0123456789”, “₀₁₂₃₄₅₆₇₈₉”)

este código produce el error:

ValueError: maketrans arguments must have same length 

No estoy seguro de por qué ocurre esto porque las cuerdas tienen la misma longitud. Mi única idea es que la longitud del texto del subíndice es algo diferente a los caracteres de tamaño estándar, pero no sé cómo solucionar esto.

No, los argumentos no son de la misma longitud:

 >>> len("0123456789") 10 >>> len("₀₁₂₃₄₅₆₇₈₉") 30 

Usted está tratando de pasar en datos codificados ; Utilicé UTF-8 aquí, donde cada dígito está codificado a 3 bytes cada uno.

No puede usar str.translate() para asignar bytes ASCII a secuencias de bytes UTF-8. Decodifique su cadena a unicode y use el método unicode.translate() ligeramente diferente; se necesita un diccionario en su lugar:

 nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")} 

Esto crea un diccionario que asigna puntos de código Unicode (enteros), que luego puede usar en una cadena Unicode :

 >>> nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")} >>> u'99 bottles of beer on the wall'.translate(nummap) u'\u2089\u2089 bottles of beer on the wall' >>> print u'99 bottles of beer on the wall'.translate(nummap) ₉₉ bottles of beer on the wall 

Luego puede codificar la salida a UTF-8 nuevamente si así lo desea.

De la documentación del método :

Para los objetos Unicode, el método translate() no acepta el argumento opcional deletechars . En su lugar, devuelve una copia de la s donde todos los caracteres se han asignado a través de la tabla de traducción que debe ser una asignación de los ordinales de Unicode a los ordinales de Unicode, cadenas de Unicode o None . Los caracteres no asignados se dejan intactos. Los caracteres asignados a None se eliminan.