如何在Python 3.5中移除重音并使用unicodedata或其他解决方案得到字符串?

2024-05-19 17:04:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在google geocoding api中使用一个字符串,我已经检查了很多线程,但是我仍然面临问题,我不知道如何解决它。

我需要addresse1是一个没有任何特殊字符的字符串。地址1例如:“32 rue d'Athènes Paris France”。

addresse1= collect.replace(' ','+').replace('\n','') 
addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore') 

这里我有一根没有口音的绳子。。。不,不。。。它不是字符串而是字节。所以我按照建议做了解码:

addresse1=addresse1.decode('utf-8') 

但是地址1和开始时完全一样。。。我该怎么办?我做错什么了?或者我不懂的unicode?还是有更好的解决方案?

谢谢

圣潘。


Tags: 字符串api地址googlereplaceutfcollectparis
3条回答

addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore')

您可能是指.encode('ascii', 'ignore'),删除非ASCII字符。UTF-8包含所有字符,因此对其进行编码不会消除任何字符,使用它的编解码循环是no-op

is there a better solution?

这取决于你想做什么。

如果只想删除变音符号而不丢失所有其他非ASCII字符,则可以在NFKD标准化后读取每个字符的unicodedata.category,并删除M类中的字符

如果您想将ASCII翻译成需要自定义替换的特定语言问题(例如在德语中ö变成oe,但在瑞典语中不是)。

如果您只是想将字符串伪造成ASCII,因为其中包含非ASCII字符会导致某些代码中断,那么修复该代码以使其与所有Unicode字符一起正常工作当然比损坏良好的数据要好得多。字母è不能用ASCII编码,但99.9989%的字符也不能编码,因此很难使其“特殊”。只支持ASCII的代码是蹩脚的。

Google Geocoding API可以很好地与Unicode一起工作,因此没有明显的理由需要您做这些事情。

预计到达时间:

url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ...

啊,你需要对你注入一个URL的数据进行URL编码。这不仅仅是针对Unicode的,上面的代码也会被许多ASCII标点符号打断。使用urllib.quote对单个字符串进行编码,或使用urllib.encode转换多个参数:

params = dict(
    address=address1.encode('utf-8'),
    key=googlekey
)
url2 = '...?' + urllib.urlencode(params)

(在Python 3中是urllib.parse.quoteurllib.parse.encode,它们会自动选择UTF-8,因此您不必在那里手动编码。)

data2 = urllib.request.urlopen(url2).read().decode('utf-8')
data3=json.loads(data2)

json.loads读取字节字符串,因此您应该可以安全地省略UTF-8解码。无论如何,json.load将直接从类似文件的对象中读取,因此您根本不必将数据加载到字符串中:

data3 = json.load(urllib.request.urlopen(url2))

使用第三方包:^{}

3>> unidecode.unidecode("32 rue d'Athènes Paris France")
"32 rue d'Athenes Paris France"

您可以使用python中的translate()方法。 以下是从tutorialspoint.com复制的示例:

#!/usr/bin/python

from string import maketrans   # Required to call maketrans function.

intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab)

这将输出:

th3s 3s str3ng 2x1mpl2....w4w!!!

因此,您可以定义希望替换哪些字符比使用replace()更容易

相关问题 更多 >