Python 2 maketrans()函数不适用于Unicode:"参数是不同的长度",当它们实际上是

Aar*_*ron 8 python string unicode translate python-2.x

[Python 2] SUB = string.maketrans("0123456789","Ο12 26 5")

此代码产生错误:

ValueError: maketrans arguments must have same length
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会发生这种情况,因为字符串长度相同.我唯一的想法是下标文本长度与标准大小的字符有某种不同,但我不知道如何解决这个问题.

Mar*_*ers 11

不,参数长度不一样:

>>> len("0123456789")
10
>>> len("??????????")
30
Run Code Online (Sandbox Code Playgroud)

您正在尝试传递编码数据 ; 我在这里使用UTF-8,每个数字编码为3个字节.

您不能使用str.translate()将ASCII字节映射到UTF-8字节序列.将字符串解码为unicode并使用稍微不同的unicode.translate()方法; 它需要一本字典:

nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"??????????")}
Run Code Online (Sandbox Code Playgroud)

这将创建一个映射Unicode代码点(整数)的字典,然后您可以在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
Run Code Online (Sandbox Code Playgroud)

然后,如果您愿意,可以再次将输出编码为UTF-8.

方法文档:

对于Unicode对象,该translate()方法不接受可选的deletechars参数.相反,它返回s的副本,其中所有字符都已通过给定的转换表映射,该转换表必须是Unicode序列到Unicode序列,Unicode字符串或的映射None.未映射的字符保持不变.映射到的字符将None被删除.

  • Aaron:这不是Python的限制......而是它暗示了ASCII和Unicode之间的差异.ASCII中没有"下标字符".使用*Unicode*字符的含义是Python不能将这些字符视为ASCII格式 - 任何这样做的尝试都可能适用于某些情况但会破坏其他情况. (2认同)