Python 2 maketrans() 函数不适用于 Unicode:实际上是“参数长度不同”

Posted

技术标签:

【中文标题】Python 2 maketrans() 函数不适用于 Unicode:实际上是“参数长度不同”【英文标题】:Python 2 maketrans() function doesn't work with Unicode: "the arguments are different lengths" when they actually are 【发布时间】:2015-07-18 11:40:40 【问题描述】:

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

此代码产生错误:

ValueError: maketrans arguments must have same length

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

【问题讨论】:

在 Python 3 中运行良好(无论如何它确实有更好的 unicode 支持),这对你来说是一个选择吗? 目前我正在运行 python 2.7,但我一定会看看 Python 3 Python 3 代码来自@ZeroPiraeus 对"Printing subscript in python" 的简洁回答 【参考方案1】:

不,参数的长度不同:

>>> 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 的字符被删除。

【讨论】:

有没有其他方法可以在 python 中获取下标字符?甚至是克服这种长度差异的方法 Aaron:这不是 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 2 maketrans() 函数不适用于 Unicode:实际上是“参数长度不同”的主要内容,如果未能解决你的问题,请参考以下文章

python-string.maketrans

python: 字符串按空格分成列表split与加密密码maketrans

python文本 maketrans和translate

maketrans与translate函数

Python 3.x中maketrans和translate用法

轻松python文本专题-maketrans和translate