Python 2 maketrans()函数不使用';t使用Unicode:“;参数的长度不同”;当他们真的是
[Python 2] SUB=string.maketrans(“0123456789”₀₁₂₃₄₅₆₇₈₉") 此代码产生以下错误:Python 2 maketrans()函数不使用';t使用Unicode:“;参数的长度不同”;当他们真的是,python,string,unicode,python-2.x,translate,Python,String,Unicode,Python 2.x,Translate,[Python 2] SUB=string.maketrans(“0123456789”₀₁₂₃₄₅₆₇₈₉") 此代码产生以下错误: ValueError: maketrans arguments must have same length 我不确定为什么会出现这种情况,因为字符串的长度相同。我唯一的想法是,下标文本的长度与标准大小的字符不同,但我不知道如何解决这个问题。不,参数的长度不同: >>> len("0123456789") 10 >>> len
ValueError: maketrans arguments must have same length
我不确定为什么会出现这种情况,因为字符串的长度相同。我唯一的想法是,下标文本的长度与标准大小的字符不同,但我不知道如何解决这个问题。不,参数的长度不同:
>>> len("0123456789")
10
>>> len("₀₁₂₃₄₅₆₇₈₉")
30
您正在尝试传入编码数据;我在这里使用UTF-8,其中每个数字编码为3个字节
您不能使用str.translate()
将ASCII字节映射到UTF-8字节序列。请将字符串解码为unicode
,然后使用稍有不同的unicode.translate()
方法;它使用字典代替:
这将创建映射Unicode代码点(整数)的字典,然后可以在Unicode字符串上使用:
然后,如果愿意,您可以再次将输出编码为UTF-8
从:
对于Unicode对象,translate()
方法不接受可选的deletechars参数。相反,它返回一个s的副本,其中所有字符都已通过给定的转换表映射,该表必须是Unicode序数到Unicode序数、Unicode字符串或无的映射。未映射的字符保持不变。映射到的字符为非e
将被删除
有没有其他方法可以在python中获取下标字符?或者甚至有一种方法可以克服这种长度差异?阿隆:这不是python的限制…而是ASCII和Unicode之间的差异的一种暗示。没有“下标字符”“在ASCII中。使用Unicode字符的含义是Python不能将这些字符视为ASCII字符——任何这样做的尝试都可能在某些情况下有效,但在其他情况下会失败。@Martijn你从哪里得到30个字符?我在输入中得到10个或“不支持的字符”,这取决于我在哪里尝试。@StefanPochmann:在配置为UTF-8的终端中使用交互式解释器。仅在Python 2中使用。在Python 2中长度为30,在Python 3中长度为10。OP的代码在Python 3中工作良好。在Python 3中工作良好(无论如何,它都有更好的unicode支持),这是您的选择吗?目前我正在运行Python2.7,但我一定会看一看Python3,Python3代码是从@ZeroPiraeus的简洁答案中得到的
nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")}
>>> 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