Python 2 maketrans()函数不适用于Unicode:"参数是不同的长度"当他们真的

时间:2015-05-07 18:23:11

标签: python string unicode python-2.x translate

[Python 2]     SUB = string.maketrans(" 0123456789"," 0 12 3 45")

此代码产生错误:

ValueError: maketrans arguments must have same length

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

1 个答案:

答案 0 :(得分:11)

不,参数长度不一样:

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

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

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

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

这将创建一个映射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

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

来自method documentation

  

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