问题描述
我正在尝试获取一个字符串以在 google geocoding api 中使用。我检查了很多线程,但我仍然面临问题,我不明白如何解决它。
我需要 addresse1 是一个没有任何特殊字符的字符串。 Addresse1 是例如:“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')
但是后来 addresse1 与开始时完全相同......我必须做什么? 我究竟做错了什么? 或者我不明白 unicode 什么? 或者有更好的解决方案吗?
谢谢,
斯蒂芬。
1楼
使用第 3 方包:
3>> unidecode.unidecode("32 rue d'Athènes Paris France")
"32 rue d'Athenes Paris France"
2楼
addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore')
您可能的意思是.encode('ascii', 'ignore')
,以删除非 ASCII 字符。
UTF-8 包含所有字符,因此对其进行编码不会消除任何字符,并且使用它的编码-解码循环是无操作的。
有更好的解决方案吗?
这取决于你想要做什么。
如果您只想删除变音符号而不丢失所有其他非 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.quote
和urllib.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楼
通常,有两种方法:(1)正则表达式和(2) 。
1) 正则表达式
分解字符串并替换来自 Unicode 块:
import unicodedata
import re
word = unicodedata.normalize("NFD", word)
word = re.sub("[\u0300-\u036f]", "", word)
它删除了重音、抑扬符号、分音符等:
pingüino > pinguino
ε?κοσι ε?σι > εικοσι εισι
对于某些语言,它可能是另一个块,例如[\?-\?]
用于。
2)str.translate
首先,创建替换表(区分大小写)然后应用它。
repl = str.maketrans(
"áéúíó",
"aeuio"
)
word.translate(repl)
多字符替换如下:
repl = {
ord("?"): "ae",
ord("?"): "oe",
}
word.translate(repl)
4楼
我在生成标签时遇到了类似的问题,用户可能必须用手机输入这些标签。
不使用第 3 方软件包,您可以简化上面 bobinces 的回答:
collect = "32 rue d'Athènes Paris France"
unicode_collect = unicodedata.normalize('NFD', collect)
address1 = unicode_collect.encode('ascii', 'ignore').decode('utf-8')
address1:
"32 rue d'Athenes Paris France"
5楼
您可以使用 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()
相比,您可以更轻松地定义要替换的字符