Python中Unicode到ASCII的映射

Python中Unicode到ASCII的映射,python,unicode,mapping,ascii,Python,Unicode,Mapping,Ascii,我通过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

我通过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)”我得到

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

return text.translate(maketrans("!?,.;():", "        ")).lower().strip()
TypeError:字符映射必须返回整数、无或unicode


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

这个问题不是一个完全独立的示例;我不能确定它是Python2还是Python3,
maketrans
来自哪里,等等。我很有可能猜错了,这就是为什么你应该确保适当地标记你的问题并提供一个答案。(事实上,很多其他人——其中一些人可能比我聪明——可能忽略了你的问题,因为这是一个模棱两可的问题。)

假设您使用的是2.x,并且您已经从string import*执行了
以获取
maketrans
,并且
json[“name”]
是unicode而不是str/字节,那么您的问题是:

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

string.maketrans
函数生成老式的8位翻译表。因此,您不能将其与
unicode.translate一起使用

您可以随时编写自己的“MakeUnitTrans”函数作为替换,如下所示:

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}
然而,从你最后的评论来看,我甚至不确定
翻译
是你想要的:

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

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


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

@abarnet谢谢我用
def get_clean_text(text)替换了我的方法:对于(‘?’、‘、‘、‘、‘、‘、‘、‘、‘、‘、‘、‘、‘(‘、‘)中的字符,’):text=text.replace(char,’).replace(‘,’).strip()返回text.lower()如果text==new_text:return True`I then get UnicodeWarning:Unicode equal comparison无法将两个参数转换为Unicode-将它们解释为不相等,我该如何继续?大概您在8位str中有一些东西需要解码,但如果看不到代码,很难猜出确切的位置。在这里或其他地方发布sscce,或者开始添加日志记录,打印出x,在尽可能多的地方为每个变量键入(x),直到找到您认为是unicode的字符串,实际上是8位。