addresse1 = unicodedata.normalize ('NFKD', addresse1) .encode ('utf-8', 'ignore')
Probabilmente si intende .encode('ascii', 'ignore')
, per rimuovere caratteri non ASCII. UTF-8 contiene tutti i caratteri, quindi la codifica non viene eliminata e un ciclo di codifica e decodifica con esso non è operativo.
c'è una soluzione migliore?
Dipende da ciò che si sta tentando di fare.
Se si desidera rimuovere i segni diacritici e non perdere tutti gli altri caratteri non-ASCII, si poteva leggere unicodedata.category
per ogni personaggio dopo NFKD-normalizzante e rimuovere quelli della categoria M.
Se vuoi traslitterare a ASCII che diventa una domanda specifica della lingua che richiede sostituzioni personalizzate (ad esempio in tedesco ö
diventa oe
, ma non in svedese).
Se si desidera fondere una stringa in ASCII perché i caratteri non ASCII al suo interno causano la rottura di un codice, è ovviamente molto meglio correggere quel codice affinché funzioni correttamente con tutti i caratteri Unicode piuttosto che manipolare dati buoni . La lettera è
non è codificabile in ASCII, ma nemmeno 99.Il 9989% di tutti i personaggi, quindi difficilmente lo rende "speciale". Il codice che supporta solo ASCII è zoppo.
L'API di geocoding di Google può funzionare perfettamente con Unicode, quindi non vi è alcun motivo ovvio per cui sia necessario eseguire questa operazione.
ETA:
url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ...
Ah, è necessario url-encode dei dati che si inietta in un URL. Questo non è solo per Unicode - il suddetto si romperà anche per molti simboli di punteggiatura ASCII. Utilizzare urllib.quote
per codificare una singola stringa, o urllib.encode
per convertire più parametri:
params = dict(
address=address1.encode('utf-8'),
key=googlekey
)
url2 = '...?' + urllib.urlencode(params)
(in Python 3 E 'urllib.parse.quote
e urllib.parse.encode
e scelgono automaticamente UTF-8 in modo non c'è bisogno di codificare manualmente lì.)
data2 = urllib.request.urlopen(url2).read().decode('utf-8')
data3=json.loads(data2)
json.loads
legge le stringhe di byte, pertanto è consigliabile omettere la decodifica UTF-8. In ogni caso json.load
leggerà direttamente da un oggetto simile a file, quindi non si dovrebbe avere per caricare i dati in una stringa a tutti:
data3 = json.load(urllib.request.urlopen(url2))
[unicode Pragmatic] (http://nedbatchelder.com/text/unipain/ unipain.html # 1) e [Il minimo assoluto di ogni sviluppatore di software assolutamente, positivamente deve conoscere l'Unicode e i set di caratteri] (http://www.joelonsoftware.com/articles/Unicode.html) può essere utile leggere in termini di comprensione cosa 'encode' e' decode' fanno (e perché non sono quello che vuoi qui). In generale, supponendo che tu stia usando una codifica che può rappresentare ogni carattere nella tua stringa, dovresti * aspettarti * 'mystring.encode (my_encoding) .decode (my_encoding) == mystring'. – lvc
La soluzione migliore è quella di correggere il programma in modo che gestisca correttamente Unicode. Gettare via i dati che non sai come gestire non è mai una buona soluzione. :) Quindi, per favore, dai un'occhiata ai link di lvc. –