Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2 maketrans()函数不使用';t使用Unicode:“;参数的长度不同”;当他们真的是_Python_String_Unicode_Python 2.x_Translate - Fatal编程技术网

Python 2 maketrans()函数不使用';t使用Unicode:“;参数的长度不同”;当他们真的是

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

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

此代码产生以下错误:

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