【问题标题】:Mapping Unicode to ASCII in Python在 Python 中将 Unicode 映射到 ASCII
【发布时间】:2012-09-12 23:25:17
【问题描述】:

我通过 urlopen 以 JSON 格式查询后收到字符串:

def get_clean_text(text):
    return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

for track in json["tracks"]:
    print track["name"].lower()
    get_clean_text(track["name"].lower())

对于字符串“türlich, türlich (sicher, dicker)”然后我得到 ​​p>

文件“main.py”,第 23 行,在 get_clean_text 中

return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

TypeError:字符映射必须返回整数、None 或 unicode

我想将字符串格式化为“türlich türlich sicher dicker”。

【问题讨论】:

    标签: python unicode mapping ascii


    【解决方案1】:

    这个问题不是一个完整的独立示例;我不能确定它是 Python 2 还是 3,maketrans 来自哪里等等。我很有可能会猜错,这就是为什么你应该确保适当地标记你的问题并提供一个short, self contained, correct example。 (这一点,以及其他许多人——其中一些人可能比我聪明——可能忽略了你的问题,因为它是模棱两可的。)

    假设您使用的是 2.x,并且您已经完成了 from string import * 以获取 maketrans,并且 json["name"] 是 unicode 而不是 str/bytes,这就是您的问题:

    有两种翻译表:旧式 8 位表(只是 256 个字符的数组)和新式稀疏表(只是将一个字符的序数映射到另一个字符的 dict)。 str.translate 函数可以使用其中任何一个,但 unicode.translate 只能使用第二个(如果您仔细考虑一下,原因应该很明显)。

    string.maketrans 函数制作旧式 8 位转换表。所以你不能和unicode.translate一起使用。

    您始终可以编写自己的“makeunitrans”函数作为替代品,如下所示:

    def makeunitrans(frm, to):
      return {ord(f):ord(t) for (f,t) in zip(frm, to)}
    

    但如果你只是想绘制某些字符,你可以做一些更特殊的事情:

    def makeunitrans(frm):
      return {ord(f):ord(' ') for f in frm}
    

    但是,从您的最终评论来看,我不确定 translate 是否是您想要的:

    我想将字符串格式化为“türlich türlich sicher dicker”

    如果你做对了,你将把字符串格式化为“türlich türlich sicher dicker”,因为你将所有这些标点符号映射到空格,而不是什么都没有。

    使用新型翻译表,您可以将任何您想要的内容映射到 None,从而解决了这个问题。但是您可能想退后一步,问为什么您首先使用translate 方法而不是例如多次调用replace(人们通常说“为了性能”,但您不会构建如果这是一个问题,则每次都内联翻译表)或使用简单的正则表达式。

    【讨论】:

    • @abarnet 谢谢我用def get_clean_text(text): for char in ('?',',','.',';','(',')'): text = text.replace(char, '').replace(' ', ' ').strip() return text.lower() 替换了我的方法现在我有`new_text = get_clean_text(track["name"]) if text == new_text: return True` 然后我得到 UnicodeWarning: Unicode equal比较未能将两个参数都转换为 Unicode - 将它们解释为不相等 我该如何继续?
    • 大概你在一个 8 位的 str 中有一些东西需要被解码,但是如果没有看到代码就很难猜出确切的位置。要么在此处或其他地方发布 sscce,要么开始添加日志,在尽可能多的地方为每个变量打印出 x, type(x),直到找到你认为是 unicode 的字符串,实际上是 8 位。
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多